Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit 6be6c3a

Browse files
committed
trying to fix edge cases
1 parent b048d0b commit 6be6c3a

File tree

4 files changed

+26
-10
lines changed

4 files changed

+26
-10
lines changed

grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.grails.datastore.mapping.model.types.Association;
3131
import org.grails.datastore.mapping.query.AssociationQuery;
3232
import org.grails.datastore.mapping.query.Query;
33+
import org.grails.datastore.mapping.query.QueryException;
3334
import org.grails.datastore.mapping.query.Restrictions;
3435
import org.grails.datastore.mapping.query.api.QueryableCriteria;
3536
import org.grails.orm.hibernate.AbstractHibernateSession;
@@ -48,6 +49,7 @@
4849
import java.util.List;
4950
import java.util.Map;
5051
import java.util.Objects;
52+
import java.util.Optional;
5153
import java.util.concurrent.ConcurrentHashMap;
5254
import java.util.function.Function;
5355
import java.util.function.Predicate;
@@ -184,6 +186,9 @@ public void add(Criterion criterion) {
184186
le(c.getProperty(),c.getValue());
185187
} else if (criterion instanceof LessThan c) {
186188
lt(c.getProperty(),c.getValue());
189+
} else {
190+
//TODO It could be that this is the only call needed!
191+
detachedCriteria.add(criterion);
187192
}
188193
}
189194

@@ -448,12 +453,14 @@ private static <T> Predicate<T> combinePredicates(Predicate<T>... predicates) {
448453

449454
protected org.hibernate.query.Query createQuery() {
450455
HibernateCriteriaBuilder cb = getCriteriaBuilder();
456+
457+
451458
List<DetachedAssociationCriteria> detachedAssociationCriteria = getDetachedAssociationCriteria();
452459

453460
Map<String, DetachedAssociationCriteria> aliasMap = detachedAssociationCriteria.stream()
454461
.collect(Collectors.toMap(
455462
DetachedAssociationCriteria::getAssociationPath,
456-
criteria ->criteria)
463+
criteria ->criteria, (oldValue,newValue) -> newValue)
457464
);
458465

459466

@@ -469,7 +476,7 @@ protected org.hibernate.query.Query createQuery() {
469476
Map<String, From> fromMap = detachedAssociationCriteria.stream()
470477
.collect(Collectors.toMap(
471478
DetachedAssociationCriteria::getAssociationPath,
472-
criteria -> cq.from(criteria.getAssociation().getOwner().getJavaClass()))
479+
criteria -> cq.from(criteria.getAssociation().getOwner().getJavaClass()) , (oldValue,newValue) -> newValue)
473480
);
474481
fromMap.put("root", root);
475482
Map<String, From> tablesByName = assignJoinTables(joinColumns, root,aliasMap, fromMap);
@@ -627,7 +634,7 @@ private Map<String, From> assignJoinTables(List<String> joinColumns, From root,
627634
private static String aliasColumn(Map<String, DetachedAssociationCriteria> aliasMap, String associationPath, Join table) {
628635
String column = associationPath;
629636
if (aliasMap.containsKey(associationPath)) {
630-
column = aliasMap.get(associationPath).getAlias();
637+
column = Optional.ofNullable(aliasMap.get(associationPath).getAlias()).orElseThrow(() -> new QueryException("Association without alias"));
631638
table.alias(column);
632639
}
633640
return column;

grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import jakarta.persistence.criteria.Predicate;
77
import jakarta.persistence.criteria.Root;
88
import jakarta.persistence.criteria.Subquery;
9+
import org.grails.datastore.gorm.query.criteria.DetachedAssociationCriteria;
910
import org.grails.datastore.mapping.query.Query;
1011
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
1112
import org.hibernate.query.criteria.JpaInPredicate;
@@ -45,6 +46,9 @@ public static Predicate[] getPredicates(HibernateCriteriaBuilder cb,
4546
} else if (criterion instanceof Query.Conjunction) {
4647
List<Query.Criterion> criterionList = ((Query.Conjunction) criterion).getCriteria();
4748
return cb.and(getPredicates(cb, criteriaQuery, root_, criterionList, tablesByName));
49+
} else if (criterion instanceof DetachedAssociationCriteria<?> c) {
50+
List<Query.Criterion> criterionList = c.getCriteria();
51+
return cb.and(getPredicates(cb, criteriaQuery, root_, criterionList, tablesByName));
4852
} else if (criterion instanceof Query.Negation) {
4953
List<Query.Criterion> criterionList = ((Query.Negation) criterion).getCriteria();
5054
Predicate[] predicates = getPredicates(cb, criteriaQuery, root_, criterionList, tablesByName);

grails-datastore-gorm-hibernate/src/test/groovy/grails/gorm/specs/TablePerSubClassAndEmbeddedSpec.groovy

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ import spock.lang.Specification
1616
* Created by graemerocher on 04/11/16.
1717
*/
1818
@ApplyDetachedCriteriaTransform
19-
class TablePerSubClassAndEmbeddedSpec extends Specification {
19+
class TablePerSubClassAndEmbeddedSpec extends HibernateGormDatastoreSpec {
20+
21+
@Override
22+
List getDomainClasses() {
23+
[Company, Vendor]
24+
}
2025

21-
@Shared @AutoCleanup HibernateDatastore hibernateDatastore = new HibernateDatastore(Company, Vendor)
22-
@Shared PlatformTransactionManager transactionManager = hibernateDatastore.getTransactionManager()
2326

2427
@Rollback
2528
void 'test table per subclass with embedded entity'() {

grails-datastore-gorm-hibernate/src/test/groovy/grails/gorm/specs/WhereQueryWithAssociationSortSpec.groovy

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package grails.gorm.specs
22

33
import grails.gorm.tests.GormDatastoreSpec
4-
import org.hibernate.QueryException
4+
import org.grails.datastore.mapping.query.QueryException
55
import spock.lang.Issue
66

77
/**
88
* Created by graemerocher on 03/11/16.
99
*/
10-
class WhereQueryWithAssociationSortSpec extends GormDatastoreSpec {
10+
class WhereQueryWithAssociationSortSpec extends HibernateGormDatastoreSpec {
1111

1212
@Issue('https://github.com/grails/grails-core/issues/9860')
1313
void "Test sort with where query that queries association"() {
@@ -28,10 +28,12 @@ class WhereQueryWithAssociationSortSpec extends GormDatastoreSpec {
2828

2929

3030
when:"a where query uses a sort on an association"
31-
results = Team.where {
31+
32+
def where = Team.where {
3233
def c1 = club
3334
c1.name ==~ '%e%'
34-
}.list(sort:'c1.name')
35+
}
36+
results = where.list(sort:'c1.name')
3537

3638

3739
then:"an exception is thrown because no alias is specified"

0 commit comments

Comments
 (0)