Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring hibernate template list as a parameter

i'm trying to execute this query : Code:

this.getHibernateTemplate()
      find("select distinct ci.customer " +
             "from CustomerInvoice ci " +
              "where ci.id in (?) " , ids);

with ids as a List, id is of type Long

when executing i get exception

Code:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long
 at org.hibernate.type.LongType.set(LongType.java:42)
 at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136)
 at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:116)
 at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:39)
 at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:491)
 at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563)
 at org.hibernate.loader.Loader.doQuery(Loader.java:673)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
 at org.hibernate.loader.Loader.doList(Loader.java:2220)
 at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
 at org.hibernate.loader.Loader.list(Loader.java:2099)
 at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
 at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
 at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
 at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
 at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
 at org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)
 at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
 at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)
 at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:836)
 at
like image 340
Hurda Avatar asked Nov 22 '10 12:11

Hurda


4 Answers

If you want to add a list to an in clause it is best to use a named parameter. This is done like so.

Query q = this.getHibernateTemplate().getSession().createQuery("select distinct ci.customer " +
             "from CustomerInvoice ci " +
              "where ci.id in (:idsParam) ");
q.setParameter("idsParam", ids);
List<Customer> = q.getResultList();
like image 51
mR_fr0g Avatar answered Nov 01 '22 17:11

mR_fr0g


In addition to mR_fr0g's answer, this one also works:

this.getHibernateTemplate() 
      findByNamedParam("select distinct ci.customer " + 
             "from CustomerInvoice ci " + 
              "where ci.id in (:ids) ", "ids", ids); 
like image 28
axtavt Avatar answered Nov 01 '22 15:11

axtavt


You could use the Hibernate Criteria API, it has a so called "in" Restriction.

Reference:

  • Restrictions.in(String, Collection)

Btw. be aware of cases where the ids collection is empty! (not only if you use the criteria API)

like image 3
Ralph Avatar answered Nov 01 '22 17:11

Ralph


You can use parameter list to inlcude in your query with 'IN' and 'setParameterList'

List<Long> ids= new ArrayList<Long>();

Query query = getSession().createQuery("select distinct ci.customer from CustomerInvoice ci where ci.id in (:ids) ");
query.setParameterList("ids", ids);
query.executeUpdate();
like image 1
borchvm Avatar answered Nov 01 '22 17:11

borchvm