16

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

java.lang.IllegalArgumentException:参数值 [568903] 与 org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370) 中 org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding 的预期类型 [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<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) {
4

3 回答 3

15

因为持久属性 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));
于 2013-03-05T19:00:40.037 回答
3

projectNolong在 DAO 中输入,所以将其更改为long.

试试这个:

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

我认为你应该改变:

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

ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo"); 
于 2013-03-05T17:08:23.153 回答
3

在您的 DAO 类中,您将获得projectNo一个字符串:

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

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

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

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

您将参数设置为字符串。尝试按如下方式更改该行(假设您已 null-checked projectNo):

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

projectNo在调用Long.parseLong. 您可以使用Apache Commons StringUtils.isNumeric来做到这一点。

于 2013-03-05T17:12:44.580 回答