Hibernate Parameter value [568903] did not match expected type [java.lang.Long]

喜夏-厌秋 提交于 2019-11-30 07:27:28

问题


I am using Hibernate 4 and I have a filter in JSF page to get search results. During execution of search I am getting the following exception

java.lang.IllegalArgumentException: Parameter value [568903] did not match expected type [java.lang.Long] at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370) at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:343) at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:370) at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:323)

Below is my code snippet, how can I fix this issue?

private Long projectNo; 

public Long getProjectNo() {
    return projectNo;
}

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

And in DAO class I have the following

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);

Edit 1

public void getProjects(ProjectQueryData data) { 

and in ProjectQueryData class, I have the following as constructor

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

回答1:


Because type of persistent attribute projectNo is Long, type argument when creating ParameterExpression should be Long. And consequently, because type of the ParameterExpression is Long, type of the parameter's value should be Long as well:

//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));



回答2:


In your DAO class, you are getting projectNo as a String:

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

However, in your model class, you are defining projectNo as a Long.

When you set parameter in your DAO on this line:

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

You are setting the parameter as a String. Try changing that line as follows (assuming that you've null-checked projectNo):

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

It also probably wouldn't hurt (defensive programming) to be sure that projectNo is numeric prior to calling Long.parseLong. You can do this with Apache Commons StringUtils.isNumeric.




回答3:


projectNo is long type in DAO, so change it to long.

Try this:

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

I think you should change:

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

to

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


来源:https://stackoverflow.com/questions/15229810/hibernate-parameter-value-568903-did-not-match-expected-type-java-lang-long

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!