Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -998,6 +998,14 @@ <Y extends Comparable<? super Y>> JpaPredicate between(

JpaPredicate notIlike(Expression<String> x, String pattern, char escapeChar);

JpaPredicate likeRegexp(Expression<String> x, String pattern);

JpaPredicate ilikeRegexp(Expression<String> x, String pattern);

JpaPredicate notLikeRegexp(Expression<String> x, String pattern);

JpaPredicate notIlikeRegexp(Expression<String> x, String pattern);

@Override
<T> JpaInPredicate<T> in(Expression<? extends T> expression);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,26 @@ public JpaPredicate notIlike(Expression<String> x, String pattern, char escapeCh
return criteriaBuilder.notIlike( x, pattern, escapeChar );
}

@Override
public JpaPredicate likeRegexp(Expression<String> x, String pattern) {
return criteriaBuilder.likeRegexp( x, pattern );
}

@Override
public JpaPredicate ilikeRegexp(Expression<String> x, String pattern) {
return criteriaBuilder.ilikeRegexp( x, pattern );
}

@Override
public JpaPredicate notLikeRegexp(Expression<String> x, String pattern) {
return criteriaBuilder.notLikeRegexp( x, pattern );
}

@Override
public JpaPredicate notIlikeRegexp(Expression<String> x, String pattern) {
return criteriaBuilder.notIlikeRegexp( x, pattern );
}

@Override
public <T> JpaInPredicate<T> in(Expression<? extends T> expression) {
return criteriaBuilder.in( expression );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3210,11 +3210,13 @@ public SqmPredicate visitIntersectsPredicate(HqlParser.IntersectsPredicateContex
query
);
}
final SelfRenderingSqmFunction<Boolean> contains = getFunctionDescriptor( "array_intersects" ).generateSqmExpression(
asList( lhs, rhs ),
null,
queryEngine()
);
final SelfRenderingSqmFunction<Boolean> contains =
getFunctionDescriptor( "array_intersects" )
.generateSqmExpression(
asList( lhs, rhs ),
null,
queryEngine()
);
return new SqmBooleanExpressionPredicate( contains, negated, nodeBuilder() );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2953,6 +2953,66 @@ public SqmPredicate notIlike(Expression<String> x, String pattern, char escapeCh
return not( ilike( x, pattern, escapeChar ) );
}

@Override
public JpaPredicate likeRegexp(Expression<String> x, String pattern) {
return new SqmBooleanExpressionPredicate(
getFunctionDescriptor( "regexp_like" )
.generateSqmExpression(
asList( (SqmExpression<String>) x,
literal( pattern ) ),
null,
getQueryEngine()
),
this
);
}

@Override
public JpaPredicate ilikeRegexp(Expression<String> x, String pattern) {
return new SqmBooleanExpressionPredicate(
getFunctionDescriptor( "regexp_like" )
.generateSqmExpression(
asList( (SqmExpression<String>) x,
literal( pattern ),
literal( "i" ) ),
null,
getQueryEngine()
),
this
);
}

@Override
public JpaPredicate notLikeRegexp(Expression<String> x, String pattern) {
return new SqmBooleanExpressionPredicate(
getFunctionDescriptor( "regexp_like" )
.generateSqmExpression(
asList( (SqmExpression<String>) x,
literal( pattern ) ),
null,
getQueryEngine()
),
true,
this
);
}

@Override
public JpaPredicate notIlikeRegexp(Expression<String> x, String pattern) {
return new SqmBooleanExpressionPredicate(
getFunctionDescriptor( "regexp_like" )
.generateSqmExpression(
asList( (SqmExpression<String>) x,
literal( pattern ),
literal( "i" ) ),
null,
getQueryEngine()
),
true,
this
);
}

@Override
@SuppressWarnings("unchecked")
public <T> SqmInPredicate<T> in(Expression<? extends T> expression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@
import org.hibernate.dialect.OracleDialect;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.dialect.SybaseASEDialect;
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.Jpa;
import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

@Jpa
Expand All @@ -31,6 +33,18 @@ void testInSelect(EntityManagerFactoryScope scope) {
scope.inEntityManager( em -> {
assertTrue( em.createQuery( "select regexp_like('abcdef', 'ab.*')", Boolean.class ).getSingleResult() );
assertTrue( em.createQuery( "select 'abcdef' like regexp 'ab.*'", Boolean.class ).getSingleResult() );
var builder = (HibernateCriteriaBuilder) em.getCriteriaBuilder();
var query = builder.createQuery( Boolean.class );
query.select( builder.likeRegexp( builder.literal( "abcdef" ), "ab.*" ) );
assertTrue( em.createQuery( query ).getSingleResult() );
} );
scope.inEntityManager( em -> {
assertFalse( em.createQuery( "select not regexp_like('abcdef', 'ab.*')", Boolean.class ).getSingleResult() );
assertFalse( em.createQuery( "select 'abcdef' not like regexp 'ab.*'", Boolean.class ).getSingleResult() );
var builder = (HibernateCriteriaBuilder) em.getCriteriaBuilder();
var query = builder.createQuery( Boolean.class );
query.select( builder.notLikeRegexp( builder.literal( "abcdef" ), "ab.*" ) );
assertFalse( em.createQuery( query ).getSingleResult() );
} );
}
}
Expand All @@ -48,9 +62,20 @@ void testInSelectCaseInsensitive(EntityManagerFactoryScope scope) {
if ( !( scope.getDialect() instanceof OracleDialect dialect
&& ( dialect.isAutonomous() || dialect.getVersion().isBefore( 23 ) ) ) ) {
scope.inEntityManager( em -> {
assertTrue( em.createQuery( "select regexp_like('ABCDEF', 'ab.*', 'i')", Boolean.class )
.getSingleResult() );
assertTrue( em.createQuery( "select regexp_like('ABCDEF', 'ab.*', 'i')", Boolean.class ).getSingleResult() );
assertTrue( em.createQuery( "select 'abcdef' ilike regexp 'ab.*'", Boolean.class ).getSingleResult() );
var builder = (HibernateCriteriaBuilder) em.getCriteriaBuilder();
var query = builder.createQuery( Boolean.class );
query.select( builder.ilikeRegexp( builder.literal( "ABCDEF" ), "ab.*" ) );
assertTrue( em.createQuery( query ).getSingleResult() );
} );
scope.inEntityManager( em -> {
assertFalse( em.createQuery( "select not regexp_like('ABCDEF', 'ab.*', 'i')", Boolean.class ).getSingleResult() );
assertFalse( em.createQuery( "select 'abcdef' not ilike regexp 'ab.*'", Boolean.class ).getSingleResult() );
var builder = (HibernateCriteriaBuilder) em.getCriteriaBuilder();
var query = builder.createQuery( Boolean.class );
query.select( builder.notIlikeRegexp( builder.literal( "ABCDEF" ), "ab.*" ) );
assertFalse( em.createQuery( query ).getSingleResult() );
} );
}
}
Expand Down