我在扩展LazyDataModel
Primefaces
@Override
public List<Project> load(int first, int pageSize,
String sortField, SortOrder sortOrder, Map<String, String> filters) {
上述过滤器的类型为Map<String, String>
在我的Hibernate Entity类中,我有以下内容
private Long projectNo; // with getters and setters
在DAO类中,我还有以下内容在JSF页面中进行搜索并返回结果
public void getProjects(ProjectQueryData data) {
Map<String, String> filters = data.getFilters();
// ....
....
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);
当我执行上述操作时,我收到以下异常
Hibernate Parameter value [89457] did not match expected type [java.lang.Long]
因为projectNo
是长的。
我的问题是我如何将Map<String,String>
投射到Map<Long,Long>
,以便我不会在此行中出现错误q.setParameter("projectNo", projectNo);
任何帮助都非常值得赞赏。
由于
答案 0 :(得分:3)
您无法投射Map<String,String> to Map<Long,Long>
,如果您的参数Map期望所有数据类型,为什么不使用Map<Object,Object>
或Map<String,Object>
。
在这种情况下,您似乎也可以通过将其强制转换为字符串来实现修复,或者在设置Map之前很长时间,
String.valueOf(projectNo);
or
Long.toString(projectNo);
任何需要的地方。