scaiandre opened a new issue, #14371:
URL: https://github.com/apache/grails-core/issues/14371

   ### Steps to Reproduce
   grails create-app detachedCriteria
   cd detachedCriteria
   ./grailsw create-domain-class Author
   ./grailsw create-domain-class Book
   
   ```
   class Book {
   
       String bookName
       Author author
   
       static constraints = {
       }
   }
   
   ```
   ```
   class Author {
   
       String authorName
       static constraints = {
       }
   }
   
   ```
   
   Try to use the domain classes in a controller or service as follows while 
using a grails.gorm.DetachedCriteria for a sub-select in the query. The query 
below is of course inefficient, but demonstrates the issue.
   
   ```
           final authors = Author.createCriteria().listDistinct {
               HibernateCriteriaBuilder hibernateCriteriaBuilder = delegate as 
HibernateCriteriaBuilder
               hibernateCriteriaBuilder.projections {
                   hibernateCriteriaBuilder.property "id"
               }
               hibernateCriteriaBuilder.inList "id", new 
grails.gorm.DetachedCriteria(Book, "alias_books").build({
                   grails.gorm.DetachedCriteria hibernateCriteriaBuilder1 = 
delegate as grails.gorm.DetachedCriteria
                   hibernateCriteriaBuilder1.createAlias("author", 
"alias_author")
                   hibernateCriteriaBuilder1.projections {
                       property 'alias_author.id'
                   }
               })
           }
   
   ```
   
   ### Expected Behaviour
   
   The above query should execute just fine.
   
   ### Actual Behaviour
   
   Stacktrace:
   ```
   Caused by: org.hibernate.QueryException: could not resolve property: 
alias_author.id of: detachedcriteria.Book
        at 
org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:77)
        at 
org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:71)
        at 
org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:2053)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getType(CriteriaQueryTranslator.java:605)
        at 
org.hibernate.criterion.PropertyProjection.getTypes(PropertyProjection.java:42)
        at 
org.hibernate.criterion.ProjectionList.getTypes(ProjectionList.java:87)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:410)
        at 
org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:135)
        at 
org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:61)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:428)
        at 
org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:95)
        at 
org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:75)
        at 
org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:80)
        at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1903)
        at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370)
        
   ```
   
   
   ### Environment Information
   
   - **Operating System**: Ubuntu 20.04 LTS
   - **Grails Version (if using Grails):** Grails 5.1.2
   - **JDK Version:** Java 11.0.13
   
   ### Demo
   https://github.com/scaiandre/grails-gorm-issue-detachedCriteria
   
   ./gradlew bootRun
   curl http://localhost:8080/detachedCriteria
   ### Related issue _Unknown entity: null_
   When instead using the alias property in a filter clause, like "eq", the 
exception is different.
   ```
           final authors = Author.createCriteria().listDistinct {
               HibernateCriteriaBuilder hibernateCriteriaBuilder = delegate as 
HibernateCriteriaBuilder
               hibernateCriteriaBuilder.projections {
                   hibernateCriteriaBuilder.property "id"
               }
               hibernateCriteriaBuilder.inList "id", new 
grails.gorm.DetachedCriteria(Book, "alias_books").build({
                   grails.gorm.DetachedCriteria hibernateCriteriaBuilder1 = 
delegate as grails.gorm.DetachedCriteria
                   hibernateCriteriaBuilder1.createAlias("author", 
"alias_author")
                   hibernateCriteriaBuilder1.projections {
                       property 'author.id'
                   }
                   hibernateCriteriaBuilder1.eq "alias_author.id", 1L
               })
           }
   
   ```
   
   Stacktrace
   ```
   Caused by: org.hibernate.HibernateException: Unknown entity: null
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getPropertyMapping(CriteriaQueryTranslator.java:646)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getType(CriteriaQueryTranslator.java:604)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getTypeUsingProjection(CriteriaQueryTranslator.java:585)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getTypedValue(CriteriaQueryTranslator.java:640)
        at 
org.hibernate.criterion.SimpleExpression.getTypedValues(SimpleExpression.java:100)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getQueryParameters(CriteriaQueryTranslator.java:357)
        at 
org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:134)
        at 
org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:61)
        at 
org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:428)
        at 
org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:95)
        at 
org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:75)
        at 
org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:80)
        at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1903)
        at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370)
                
   ```
   
   ### Just using createAlias without referring to it, works
   This does not raise an exception
   ```
           final authors = Author.createCriteria().listDistinct {
               HibernateCriteriaBuilder hibernateCriteriaBuilder = delegate as 
HibernateCriteriaBuilder
               hibernateCriteriaBuilder.projections {
                   hibernateCriteriaBuilder.property "id"
               }
               hibernateCriteriaBuilder.inList "id", new 
grails.gorm.DetachedCriteria(Book, "alias_books").build({
                   grails.gorm.DetachedCriteria hibernateCriteriaBuilder1 = 
delegate as grails.gorm.DetachedCriteria
                   hibernateCriteriaBuilder1.createAlias("author", 
"alias_author")
                   hibernateCriteriaBuilder1.projections {
                       property 'author.id'
                   }
               })
           }
   ```
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to