Hibernate参数值[568903]与预期类型[java.lang.Long]不匹配

时间:2013-03-05 17:05:29

标签: java hibernate jpa jpa-2.0

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

  

java.lang.IllegalArgumentException:参数值[568903]不匹配       期望的类型[java.lang.Long]           在org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370)           在org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(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<Predicate> criteria = new ArrayList<Predicate>();
    if (projectNo!= null) {
    ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo");             
    Predicate predicate = cb.equal(emp.get(Project_.projectNo), pexp);
    criteria.add(predicate);
}
TypedQuery<Project> q = entityManager.createQuery(c);
TypedQuery<Long> 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<String, String> filters) {

3 个答案:

答案 0 :(得分:11)

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

//because this persistent Attribute is Long:
private Long projectNo; 

//we use Long here as well
ParameterExpression<Long> 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));

答案 1 :(得分:3)

在您的DAO课程中,您将获得projectNo字符串:

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

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

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

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

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

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

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

答案 2 :(得分:2)

在DAO中

projectNolong类型,因此请将其更改为long

试试这个:

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

我认为你应该改变:

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

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