Java 如何使用HibernateTemplate.find(…)和list

Java 如何使用HibernateTemplate.find(…)和list,java,hibernate,hql,Java,Hibernate,Hql,我刚开始冬眠。前面我尝试使用以下查询 this.getHibernateTemplate() find("select distinct ci.customer " + "from CustomerInvoice ci " + "where ci.name = ? and ci.id in ? ",name,ids); 其中ids是id的列表。它抛出classCastException。有人能告诉我有道理的解决办法吗 例外情况

我刚开始冬眠。前面我尝试使用以下查询

 this.getHibernateTemplate()
      find("select distinct ci.customer " +
             "from CustomerInvoice ci " +
              "where ci.name = ? and ci.id in ? ",name,ids);
其中ids是id的列表。它抛出classCastException。有人能告诉我有道理的解决办法吗

例外情况:

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
at org.hibernate.type.descriptor.java.StringTypeDescriptor.unwrap(StringTypeDescriptor.java:40)
at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$1.doBind(VarcharTypeDescriptor.java:52)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278)
at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:68)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:578)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1716)
at org.hibernate.loader.Loader.doQuery(Loader.java:801)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2542)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:921)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912) 
试试这个:

List customers = getHibernateTemplate().executeFind(new HibernateCallback<List>() {
        @Override
        public List doInHibernate(Session session) throws HibernateException, SQLException {
            Query query = session.createQuery(
                    "select distinct ci.customer " +
                            "from CustomerInvoice ci " +
                            "where ci.name = :name and ci.id in (:ids) "
            );
            query.setParameter("name", name);
            query.setParameterList("ids", ids);
            return query.list();
        }
});
首先,我认为您需要将inquery参数包装在。。。 您可以尝试使用find方法,但如果该方法不知道如何应用list参数类型,则可以使用setParameterList显式设置它,如我的示例所示。
尝试此操作,您的错误将得到解决:

this.getHibernateTemplate()
      find("select distinct ci.customer " +
         "from CustomerInvoice ci " +
          "where ci.name = ? and ci.id in ?",new Object[]{name,ids});

始终粘贴得到的异常的完整堆栈跟踪。这很有帮助。此外,在?的周围不应该有括号。谢谢,我已经更正了错误。我猜AT name参数是一个字符串数组,而不是字符串。向我们展示变量id和name是如何声明的;