2010-11-22 32 views
5

tôi đang cố gắng để thực hiện truy vấn này: Code:mùa xuân ngủ đông mẫu danh sách như một tham số

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

với id như một danh sách, id là loại dài

khi thực hiện tôi nhận được ngoại lệ

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

tôi hy vọng 'ids' không phải là' List' –

+0

nó được. nó được viết trong câu hỏi. Nhưng nó sẽ hoạt động. – Bozho

+0

org.life.java tại sao bạn hy vọng như vậy? đó là Danh sách , tôi có thể sử dụng bất kỳ bộ sưu tập nào khác mặc dù ... – Hurda

Trả lời

7

Ngoài câu trả lời mR_fr0g của, chương trình này cũng làm việc:

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

Ba cổ vũ cho cú pháp ngắn hơn! Đừng để bị lừa khi nghĩ rằng bạn cần xây dựng chuỗi phức tạp cho các biến vị ngữ IN. –

9

Nếu bạn muốn thêm một danh sách để một trong khoản đó là bes để sử dụng tham số được đặt tên. Điều này được thực hiện như vậy.

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

Bạn có thể sử dụng API tiêu chí Hibernate, nó có một giới hạn được gọi là "trong".

tham khảo:

Btw. lưu ý các trường hợp bộ sưu tập id trống! (Không chỉ nếu bạn sử dụng API tiêu chí)

1

Bạn có thể sử dụng danh sách tham số để inlcude trong truy vấn của bạn với 'trong' và '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(); 
Các vấn đề liên quan