2010-11-22 15 views
5

ように、テンプレートの一覧を休止私は例外を取得し実行する際に一覧としてIDSと春、私はこのクエリを実行しようとしているパラメータ

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

を、idがタイプのロング

ある

コード:

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

私はids'が、それは 'List' –

+0

ではありません'願っています。それは質問に書かれています。しかし、それは動作するはずです。 – Bozho

+0

org.life.javaなぜそう望みますか?それはリストですが、私は他のコレクションを使用することができます... – Hurda

答えて

7

mR_fr0gの答えに加えて、この1も動作します:

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

短い構文の3つの喝采! IN述語のための精巧なストリング・ビルダーが必要だと考えることに惑わされないでください。 –

9

あなたが句でにリストを追加したい場合は、BESであります名前付きパラメータを使用する。これはそうそうです。

3

Hibernate Criteria APIを使用することができます。これはいわゆる "in" Restrictionです。

参考:ところで

。 idsコレクションが空の場合に注意してください! (だけでなく、あなたが基準のAPIを使用している場合)

1

あなたはIN「」と「setParameterList」でクエリでinlcudeするパラメータリストを使用することができます

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(); 
関連する問題