Hibernate参数值与预期类型不匹配

我正在使用Hibernate 4,我在JSF页面中有一个filter来获取搜索结果。 在执行搜索期间,我收到以下exception

java.lang.IllegalArgumentException:参数值[568903]与org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding上的org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370)中的预期类型[java.lang.Long]不匹配(AbstractQueryImpl.java:343)org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:370)org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:323)

以下是我的代码段,如何解决此问题?

private Long projectNo; public Long getProjectNo() { return projectNo; } public void setProjectNo(Long projectNo) { this.projectNo = projectNo; } 

在DAO课程中,我有以下内容

 String projectNo = filters.get("projectNo"); List criteria = new ArrayList(); if (projectNo!= null) { ParameterExpression pexp = cb.parameter(String.class, "projectNo"); Predicate predicate = cb.equal(emp.get(Project_.projectNo), pexp); criteria.add(predicate); } TypedQuery q = entityManager.createQuery(c); TypedQuery countquery = entityManager.createQuery(countQ); q.setParameter("projectNo", projectNo); // error in this line countquery.setParameter("projectNo", projectNo); 

编辑1

 public void getProjects(ProjectQueryData data) { 

ProjectQueryData类中,我有以下作为构造函数

 public ProjectQueryData (int start, int end, String field, QuerySortOrder order, Map filters) { 

由于持久属性projectNo的类型为Long ,因此在创建ParameterExpression时类型参数应为Long 。 因此,因为ParameterExpression的类型是Long ,所以参数值的类型也应该是Long:

 //because this persistent Attribute is Long: private Long projectNo; //we use Long here as well ParameterExpression pexp = cb.parameter(Long.class, "projectNo"); ... //and finally set parameter. Long again, because that is the type // type of ParameterExpression: query.setParameter("projectNo", Long.valueOf(projectNo)); 

在DAO类中,您将projectNo作为String:

 String projectNo = filters.get("projectNo"); 

但是,在模型类中,您将projectNo定义为Long。

在此行中在DAO中设置参数时:

 q.setParameter("projectNo", projectNo); // error in this line 

您将参数设置为String。 尝试更改该行,如下所示(假设您已经空检查了projectNo ):

 q.setParameter("projectNo", Long.parseLong(projectNo)); 

在调用Long.parseLong之前,确保projectNo是数字也可能不会受到影响(防御性编程)。 您可以使用Apache Commons StringUtils.isNumeric执行此操作。

projectNo是DAO中的long类型,因此将其更改为long

尝试这个:

 q.setParameter("projectNo", new Long(projectNo)); 

我想你应该改变:

 ParameterExpression pexp = cb.parameter(Long.class, "projectNo"); 

 ParameterExpression pexp = cb.parameter(String.class, "projectNo");