[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2225?page=c...
]
Mihail Fridliand commented on HHH-2225:
---------------------------------------
This seems to be a general problem when using components in the native SQL. Suppose, the
have class "A" containing a component class "Component" containing a
collection of "B"
public class A {
private Long oid;
private Component comp = new Component();
public Component getComp() {return comp;}
public void setComp(Component comp) {this.comp = comp;}
public Long getOid() { return oid;}
public void setOid(Long oid) {this.oid = oid;}
}
public class Component {
private Set collection = new HashSet(0);
public Set getCollection() { return collection;}
public void setCollection(Set collection) { this.collection = collection;}
}
public class B {
private Long oid;
public Long getOid() { return oid;}
public void setOid(Long oid) {this.oid = oid;}
}
the mappings test1.hbm.xml:
<hibernate-mapping>
<class name="A" table="A" >
<id name="oid" type="java.lang.Long">
<column name="OID" />
<generator class="assigned" />
</id>
<component name="comp" class="Component">
<set name="collection" inverse="true"
cascade="all">
<key>
<column name="A_OID" not-null="true" />
</key>
<one-to-many class="B" />
</set>
</component>
</class>
<class name="B" table="B" >
<id name="oid" type="java.lang.Long">
<column name="OID" />
<generator class="assigned" />
</id>
</class>
<resultset name="AandB">
<return alias="a" class="A"/>
<return-join alias="ac" property="a.comp"/>
<return-join alias="b" property="ac.collection"/>
</resultset>
<sql-query name="getAandB" resultset-ref="AandB" >
<![CDATA[
select DISTINCT {a.*},{b.*} from A a join B b on a.OID = b.A_OID
]]>
</sql-query>
</hibernate-mapping>
For this simple case I get a NPE
java.lang.NullPointerException
at
org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processJoinReturn(SQLQueryReturnProcessor.java:434)
at
org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:338)
at
org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:148)
at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:64)
at
org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:43)
at
org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:114)
at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:444)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:351)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291)
at
com.dcx.ivkmds.fwk.pc.hibernate.HibernateUtil.rebuildSessionFactory(HibernateUtil.java:191)
at com.dcx.ivkmds.fwk.pc.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:59)
The NPE is caused by the following code in the SQLQueryReturnProcessor class:
private void processJoinReturn(NativeSQLQueryJoinReturn fetchReturn) {
.....
// If this return's alias has not been processed yet, do so b4 further
processing of this return
if ( !alias2Persister.containsKey( ownerAlias ) ) {
NativeSQLQueryNonScalarReturn ownerReturn = ( NativeSQLQueryNonScalarReturn )
alias2Return.get(ownerAlias);
processReturn( ownerReturn );
}
SQLLoadable ownerPersister = ( SQLLoadable ) alias2Persister.get( ownerAlias );
Type returnType = ownerPersister.getPropertyType( fetchReturn.getOwnerProperty() );
.....
When the property ac.collection is processed, there is no for the component Component
(ownerAlias = "ac"). Therefore processReturn(ownerReturn) is invoked. But
processReturn ignores component types. Then
alias2Persister.get(ownerAlias)
still have no entry for the ownerAlias => ownerPersister is null =>
NullPointerException at the next line.
If I change the resultset to (my first try)
<resultset name="AandB">
<return alias="a" class="A"/>
<return-join alias="b" property="a.comp.collection"/>
</resultset>
and try to relate to the collection of B's directly, I get
org.hibernate.HibernateException: Owner alias [a.comp] is unknown for alias [b]
at
org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processJoinReturn(SQLQueryReturnProcessor.java:424)
at
org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:338)
at
org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:148)
at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:64)
What is wrong ??
NPE when eager fetching joined component with native SQL query
--------------------------------------------------------------
Key: HHH-2225
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2225
Project: Hibernate3
Issue Type: Bug
Components: query-sql
Affects Versions: 3.2.0.ga
Reporter: Christian Bauer
Priority: Minor
Item -> many-to-one -> User -> joined component -> billingAddress
This:
result = session.createSQLQuery("select {i.*}, {u.*}, {ba.*} from ITEM i" +
" join USERS u on i.SELLER_ID =
u.USER_ID" +
" left join BILLING_ADDRESS ba on u.USER_ID
= ba.USER_ID" +
" where u.USERNAME = :uname")
.addEntity("i", Item.class)
.addJoin("u", "i.seller")
.addJoin("ba", "u.billingAddress")
fails with:
java.lang.NullPointerException
at org.hibernate.loader.DefaultEntityAliases.<init>(DefaultEntityAliases.java:37)
at
org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.generateCustomReturns(SQLQueryReturnProcessor.java:283)
at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:129)
at
org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:43)
at
org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:114)
at
org.hibernate.impl.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:137)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira