2010-11-22 10 views
5

sto cercando di eseguire questa query: Codice:Primavera elenco di modelli Hibernate come parametro

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

con ids come un elenco, id è di tipo Long

durante l'esecuzione ottengo un'eccezione

Codice:

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

Spero 'ids' non è' list' –

+0

è. è scritto nella domanda. Ma dovrebbe funzionare. – Bozho

+0

org.life.java perché lo speri? è la lista , posso comunque usare qualsiasi altra raccolta ... – Hurda

risposta

7

Oltre alla risposta di mR_fr0g, questo funziona anche:

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

Tre evviva per sintassi più breve! Non fatevi ingannare nel pensare di aver bisogno di costruttori di stringhe elaborati per i predicati IN. –

9

Se si desidera aggiungere un elenco per una clausola che è bes t per usare un parametro con nome. Questo è fatto così.

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

È possibile utilizzare l'API di Hibernate Criteria, ha una cosiddetta restrizione "in".

Riferimento:

Btw. essere a conoscenza dei casi in cui la collezione ids è vuota! (Non solo se si utilizza l'API criteri)

1

È possibile utilizzare l'elenco di parametri per inlcude nella query con 'IN' e '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(); 
Problemi correlati