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 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);
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 filters) {
解决方案
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 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));