Skip to content

Commit 48af9bb

Browse files
committed
HHH-18979 simplify Range.toPredicate signature
1 parent 78e03f5 commit 48af9bb

File tree

10 files changed

+26
-38
lines changed

10 files changed

+26
-38
lines changed

hibernate-core/src/main/java/org/hibernate/query/AttributeRange.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ public Restriction<X> negated() {
2424

2525
@Override
2626
public Predicate toPredicate(Root<? extends X> root, CriteriaBuilder builder) {
27-
return range.toPredicate( root, attribute, builder );
27+
return range.toPredicate( root.get( attribute ), builder );
2828
}
2929
}

hibernate-core/src/main/java/org/hibernate/query/NamedAttributeRange.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,14 @@ public Predicate toPredicate(Root<? extends X> root, CriteriaBuilder builder) {
3030
if ( !entity.isAssignableFrom( entityType.getJavaType() ) ) {
3131
throw new IllegalArgumentException( "Root entity is not a subtype of '" + entity.getTypeName() + "'" );
3232
}
33-
final Attribute<?, ?> att = entityType.getAttribute( attributeName );
34-
if ( !range.getType().isAssignableFrom( att.getJavaType() ) ) {
33+
final Attribute<?, ?> attribute = entityType.getAttribute( attributeName );
34+
if ( !(attribute instanceof SingularAttribute) ) {
35+
throw new IllegalArgumentException( "Attribute '" + attributeName + "' is not singular" );
36+
}
37+
if ( !range.getType().isAssignableFrom( attribute.getJavaType() ) ) {
3538
throw new IllegalArgumentException( "Attribute '" + attributeName
3639
+ "' is not assignable to range of type '" + range.getType().getName() + "'" );
3740
}
38-
if ( !(att instanceof SingularAttribute) ) {
39-
throw new IllegalArgumentException( "Attribute '" + attributeName + "' is not singular" );
40-
}
41-
@SuppressWarnings("unchecked")
42-
final SingularAttribute<X, U> attribute = (SingularAttribute<X, U>) att;
43-
return range.toPredicate( root, attribute, builder );
41+
return range.toPredicate( root.get( attributeName ), builder );
4442
}
4543
}

hibernate-core/src/main/java/org/hibernate/query/range/CaseInsensitiveValue.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import jakarta.persistence.criteria.Expression;
99
import jakarta.persistence.criteria.Path;
1010
import jakarta.persistence.criteria.Predicate;
11-
import jakarta.persistence.metamodel.SingularAttribute;
1211

1312
import java.util.Locale;
1413

@@ -17,13 +16,13 @@
1716
*/
1817
record CaseInsensitiveValue(String value) implements Range<String> {
1918
@Override
20-
public <X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, String> attribute, CriteriaBuilder builder) {
19+
public Predicate toPredicate(Path<String> path, CriteriaBuilder builder) {
2120
// TODO: it would be much better to not do use literal,
2221
// and let it be treated as a parameter, but we
2322
// we run into the usual bug with parameters in
2423
// manipulated SQM trees
2524
final Expression<String> literal = builder.literal( value.toLowerCase( Locale.ROOT ) );
26-
return builder.lower( root.get( attribute ) ).equalTo( literal );
25+
return builder.lower( path ).equalTo( literal );
2726
}
2827

2928
@Override

hibernate-core/src/main/java/org/hibernate/query/range/Interval.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,17 @@
77
import jakarta.persistence.criteria.CriteriaBuilder;
88
import jakarta.persistence.criteria.Path;
99
import jakarta.persistence.criteria.Predicate;
10-
import jakarta.persistence.metamodel.SingularAttribute;
1110

1211
/**
1312
* Restricts to an upper-bounded and lower-bounded interval.
1413
*/
1514
record Interval<U extends Comparable<U>>(LowerBound<U> lowerBound, UpperBound<U> upperBound)
1615
implements Range<U> {
1716
@Override
18-
public <X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, U> attribute, CriteriaBuilder builder) {
17+
public Predicate toPredicate(Path<U> path, CriteriaBuilder builder) {
1918
return lowerBound.open() || upperBound.open()
20-
? builder.and( lowerBound.toPredicate( root, attribute, builder ),
21-
upperBound.toPredicate( root, attribute, builder ) )
22-
: builder.between( root.get( attribute ),
23-
builder.literal( lowerBound.bound() ), builder.literal( upperBound.bound() ) );
19+
? builder.and( lowerBound.toPredicate( path, builder ), upperBound.toPredicate( path, builder ) )
20+
: builder.between( path, builder.literal( lowerBound.bound() ), builder.literal( upperBound.bound() ) );
2421
}
2522

2623
@Override

hibernate-core/src/main/java/org/hibernate/query/range/LowerBound.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,21 @@
88
import jakarta.persistence.criteria.Expression;
99
import jakarta.persistence.criteria.Path;
1010
import jakarta.persistence.criteria.Predicate;
11-
import jakarta.persistence.metamodel.SingularAttribute;
1211

1312
/**
1413
* Restricts to all values higher than a given lower bound.
1514
*/
1615
record LowerBound<U extends Comparable<U>>(U bound, boolean open) implements Range<U> {
1716
@Override
18-
public <X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, U> attribute, CriteriaBuilder builder) {
17+
public Predicate toPredicate(Path<U> path, CriteriaBuilder builder) {
1918
// TODO: it would be much better to not do use literal,
2019
// and let it be treated as a parameter, but we
2120
// we run into the usual bug with parameters in
2221
// manipulated SQM trees
2322
final Expression<U> literal = builder.literal( bound );
2423
return open
25-
? builder.greaterThan( root.get( attribute ), literal )
26-
: builder.greaterThanOrEqualTo( root.get( attribute ), literal );
24+
? builder.greaterThan( path, literal )
25+
: builder.greaterThanOrEqualTo( path, literal );
2726
}
2827

2928
@Override @SuppressWarnings("unchecked")

hibernate-core/src/main/java/org/hibernate/query/range/Pattern.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import jakarta.persistence.criteria.CriteriaBuilder;
88
import jakarta.persistence.criteria.Path;
99
import jakarta.persistence.criteria.Predicate;
10-
import jakarta.persistence.metamodel.SingularAttribute;
1110

1211
import java.util.Locale;
1312

@@ -16,10 +15,10 @@
1615
*/
1716
record Pattern(String pattern, boolean caseSensitive) implements Range<String> {
1817
@Override
19-
public <X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, String> attribute, CriteriaBuilder builder) {
18+
public Predicate toPredicate(Path<String> path, CriteriaBuilder builder) {
2019
return caseSensitive
21-
? builder.like( root.get( attribute ), builder.literal( pattern ) )
22-
: builder.like( builder.lower( root.get( attribute ) ),
20+
? builder.like( path, builder.literal( pattern ) )
21+
: builder.like( builder.lower( path ),
2322
builder.literal( pattern.toLowerCase( Locale.ROOT ) ) );
2423
}
2524

hibernate-core/src/main/java/org/hibernate/query/range/Range.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import jakarta.persistence.criteria.CriteriaBuilder;
88
import jakarta.persistence.criteria.Path;
99
import jakarta.persistence.criteria.Predicate;
10-
import jakarta.persistence.metamodel.SingularAttribute;
1110
import org.hibernate.Incubating;
1211
import org.hibernate.Internal;
1312
import org.hibernate.query.Restriction;
@@ -36,7 +35,7 @@ public interface Range<U> {
3635
* values.
3736
*/
3837
@Internal
39-
<X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, U> attribute, CriteriaBuilder builder);
38+
Predicate toPredicate(Path<U> path, CriteriaBuilder builder);
4039

4140
static <U> Range<U> singleValue(U value) {
4241
return new Value<>( value );

hibernate-core/src/main/java/org/hibernate/query/range/UpperBound.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,21 @@
88
import jakarta.persistence.criteria.Expression;
99
import jakarta.persistence.criteria.Path;
1010
import jakarta.persistence.criteria.Predicate;
11-
import jakarta.persistence.metamodel.SingularAttribute;
1211

1312
/**
1413
* Restricts to all values lower than a given upper bound.
1514
*/
1615
record UpperBound<U extends Comparable<U>>(U bound, boolean open) implements Range<U> {
1716
@Override
18-
public <X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, U> attribute, CriteriaBuilder builder) {
17+
public Predicate toPredicate(Path<U> path, CriteriaBuilder builder) {
1918
// TODO: it would be much better to not do use literal,
2019
// and let it be treated as a parameter, but we
2120
// we run into the usual bug with parameters in
2221
// manipulated SQM trees
2322
final Expression<U> literal = builder.literal( bound );
2423
return open
25-
? builder.lessThan( root.get( attribute ), literal )
26-
: builder.lessThanOrEqualTo( root.get( attribute ), literal );
24+
? builder.lessThan( path, literal )
25+
: builder.lessThanOrEqualTo( path, literal );
2726
}
2827

2928
@Override @SuppressWarnings("unchecked")

hibernate-core/src/main/java/org/hibernate/query/range/Value.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,19 @@
88
import jakarta.persistence.criteria.Expression;
99
import jakarta.persistence.criteria.Path;
1010
import jakarta.persistence.criteria.Predicate;
11-
import jakarta.persistence.metamodel.SingularAttribute;
1211

1312
/**
1413
* Restricts to a single literal value.
1514
*/
1615
record Value<U>(U value) implements Range<U> {
1716
@Override
18-
public <X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, U> attribute, CriteriaBuilder builder) {
17+
public Predicate toPredicate(Path<U> path, CriteriaBuilder builder) {
1918
// TODO: it would be much better to not do use literal,
2019
// and let it be treated as a parameter, but we
2120
// we run into the usual bug with parameters in
2221
// manipulated SQM trees
2322
final Expression<U> literal = builder.literal( value );
24-
return root.get( attribute ).equalTo( literal );
23+
return path.equalTo( literal );
2524
}
2625

2726
@Override @SuppressWarnings("unchecked")

hibernate-core/src/main/java/org/hibernate/query/range/ValueList.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import jakarta.persistence.criteria.CriteriaBuilder;
88
import jakarta.persistence.criteria.Path;
99
import jakarta.persistence.criteria.Predicate;
10-
import jakarta.persistence.metamodel.SingularAttribute;
1110

1211
import java.util.List;
1312

@@ -16,8 +15,8 @@
1615
*/
1716
record ValueList<U>(List<U> values) implements Range<U> {
1817
@Override
19-
public <X> Predicate toPredicate(Path<? extends X> root, SingularAttribute<X, U> attribute, CriteriaBuilder builder) {
20-
return root.get( attribute ).in( values.stream().map( builder::literal ).toList() );
18+
public Predicate toPredicate(Path<U> path, CriteriaBuilder builder) {
19+
return path.in( values.stream().map( builder::literal ).toList() );
2120
}
2221

2322
@Override @SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)