Since years we use interface types as return type when doing queries:
{code:java} NativeQuery<Company> sqlQuery = session.createNativeQuery("select {c.*} from Company", Company.class); sqlQuery.addEntity("c", CompanyPeer.class); List<Company> list = sqlQuery.list(); {code}
where CompanyPeer is the mapped class which implements Company, an interface which declares all getter- and setter-methods for the persistent fields.
Now with 5.3.3 the query above raises a MappingException: org.hibernate.MappingException: Unknown entity: com. wuerth zigzag . phoenix.Cis. models. ImplementedCompany Company at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:670) at org.hibernate.engine.spi.SessionFactoryImplementor.getEntityPersister(SessionFactoryImplementor.java:338) at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.getSQLLoadable(SQLQueryReturnProcessor.java:445) at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processRootReturn(SQLQueryReturnProcessor.java:498) at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:465) at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:180) at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:74) at org.hibernate.engine.query.internal.NativeQueryInterpreterStandardImpl.createQueryPlan(NativeQueryInterpreterStandardImpl.java:41) at org.hibernate.engine.query.spi.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:213) at org.hibernate.internal.AbstractSharedSessionContract.getNativeQueryPlan(AbstractSharedSessionContract.java:599) at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1053)
The problem is that with HHH-12779 a vital filter has been removed in AbstractSharedSessionContract on line 938, so the return-type get assigned although the type is not assigneable from resultClass :(
The removed filter is: this.getFactory().getMetamodel().getEntities() .stream() .anyMatch( entityType -> entityType.getJavaType().isAssignableFrom( resultClass ) )
The fix is trivial, just reput the filter as follows on line 938:
{code:java} else if ( this.getFactory().getMetamodel().getEntities().stream().anyMatch( entityType -> entityType.getJavaType().isAssignableFrom( resultClass ) ) ) { {code}
If needed, I will provide a test-case tomorrow. |
|