Joined: Wed Sep 28, 2005 11:07 am Posts: 4 Location: Imola, Italy
|
I found a strange behavior with criteria and Expression.in restriction:
I have a method that receives a session, creates a criteria and returns a List.
If I pass a session = sessionFactory.openSession(); the criteria works correctly; if I pass a:
Session dom4jSession = session.getSession(EntityMode.DOM4J);
the criteria throws an exception:
In detail:
public Document getXMLFunction(){
Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
Session dom4jSession = session.getSession(EntityMode.DOM4J);
List results = listFromCriteria(dom4jSession);
DocumentFactory docFactory = DocumentFactory.getInstance();
Document doc = docFactory.createDocument();
............
}
public List<MyObj> getMyListFunction(){
Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
myRes = listFromCriteria(session);
tx.commit();
...........
}
private List listFromCriteria(Session session){
Criteria myCriteria = session.createCriteria(MyObj.class);
if( myList != null && myList.size() > 0 ){
myCriteria.add(Expression.in("id.refObj", myList ));
}
return myCriteria.list();
}
class MyObj{
MyObjKey id;
..................
}
class MyObjKey{
RefObj refObj;
Date myDate;
...........
}
class RefObj{
Short myNumber;
private java.util.Set myObjSet;
....................
}
MyObj.hbm.xml
<hibernate-mapping>
<class name="model.data.MyObj" table="MYOBJ">
<composite-id name="id" class="model.data.MyObjKey">
<key-property name="myDate" column="MYDATE" type="timestamp"/>
<key-many-to-one name="refObj" column="MYNUMBER" class="model.data.RefObj"/>
</composite-id>
........................
</class>
</hibernate-mapping>
RefObj.hbm.xml
<hibernate-mapping>
<class name="model.data.RefObj" table="REFOBJ">
<id name="myNumber" column="MYNUMBER" type="short">
<generator class="assigned"/>
</id>
...............
<set name="myObjSet" inverse="true" embed-xml="false">
<key column="MYNUMBER"/>
<one-to-many class="model.data.MyObj"/>
</set>
</class>
</hibernate-mapping>
With session.getSession(EntityMode.DOM4J) parameter when I call myCriteria.list() I receive
Caused by: java.lang.ClassCastException: model.data.RefObj
at org.hibernate.type.ShortType.set(ShortType.java:38)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:62)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:44)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:69)
at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1115)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1177)
at org.hibernate.loader.Loader.doQuery(Loader.java:390)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
at org.hibernate.loader.Loader.doList(Loader.java:1593)
at org.hibernate.loader.Loader.list(Loader.java:1577)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:111)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1322)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:300)
at model.service.MyService.listFromCriteria(MyService.java:107)
at model.service.MyService.getXMLFunction(MyService.java:58)
The getMyListFunction works correctly.
For correct getXMLFunction behavior I need to modify listFromCriteria in this mode:
private List listFromCriteria(Session session){
Criteria myCriteria = session.createCriteria(MyObj.class);
if( myList!= null && myList.size() > 0 ){
List ml = new ArrayList();
Iterator<RefObj> iel = myList.iterator();
while(iel.hasNext()){
RefObj el = iel.next();
ml.add(el.getMyNumber());
}
myCriteria .add(Expression.in("id.refObj.myNumber", ml));
return myCriteria.list();
}
Hibernate version 3.05
Now it's all right
Thank you
Stefano
|
|