2010-11-22 11 views
5

ich versuche, diese Abfrage auszuführen: Code:Frühling Hibernate Vorlagenliste als Parameter

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

mit ids als List, ist id vom Typ Langen

wenn ich Ausnahme erhalten Ausführung

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 
+0

ich hoffe 'ids' ist nicht' list' –

+0

es ist. Es steht in der Frage geschrieben. Aber es sollte funktionieren. – Bozho

+0

org.life.java warum hoffst du das? Es ist Liste , ich kann jede andere Sammlung verwenden, obwohl ... – Hurda

Antwort

7

Neben mR_fr0g Antwort, diese funktioniert auch:

this.getHibernateTemplate() 
     findByNamedParam("select distinct ci.customer " + 
      "from CustomerInvoice ci " + 
       "where ci.id in (:ids) ", "ids", ids); 
+0

Drei Prost für kürzere Syntax! Lassen Sie sich nicht davon abbringen, dass Sie für IN-Prädikate aufwändige String-Builder benötigen. –

9

Wenn Sie eine Liste auf eine in-Klausel ist es hinzufügen möchten BES t um einen benannten Parameter zu verwenden. Das ist so gemacht.

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(); 
3

Sie könnten die Hibernate Criteria API verwenden, sie hat eine sogenannte "in" -Restriktion.

Referenz:

Btw. Achten Sie auf Fälle, in denen die IDs-Sammlung leer ist! (Nicht nur, wenn Sie die Kriterien API)

1

Sie Parameterliste können mit ‚IN‘ in der Abfrage inlcude und ‚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(); 
0
ProjectionList projList = 
    Projections.projectionList().add("customer","customer"); 
    List<Long> ids = ids; 
    Criteria criteria = hibernateTemplate.getSessionFactory().getCurrentSession() 
     .createCriteria(CustomerInvoice.class) 
     .add(Restrictions.in("id",ids)) 
     .setProjection(projList); List<Long> listOfIds = criteria.list(); 
Verwandte Themen