我要封装一个基于hibernate6的 查询函数,大概的需求是这样的,传入一个hql语句,返回List<Map<String,Object>>,完成的函数如下:
public List<Map> findMap(String hql, Object... values) throws Exception {
Query<Map> queryObject = getSession().createQuery(hql,Map.class);
if (values != null) {
for (int i = 1; i <= values.length; i++) {
if (values[i-1].getClass().isArray()) {
Object[] pas = (Object[]) values[i-1];
queryObject.setParameterList(i, pas);
} else {
queryObject.setParameter(i, values[i-1]);
}
}
}
queryObject.unwrap(Query.class).setTupleTransformer((tuple, aliases)->{
Map<String, Object> map=new HashMap<>();
map.put(aliases[0], tuple[0]);
return map;
});
return queryObject.list();
}
以上代码是可以运行的,但是两个警告:
1、Map is a raw type. References to generic type Map<K,V> should be parameterized
2、Type safety: The method setTupleTransformer(TupleTransformer) belongs to the raw type Query. References to generic type Query should be parameterized
请问在不使用注解 :@SuppressWarnings({ "rawtypes", "unchecked" })的情况下,如何优雅的消除这个警告
第一个警告是因为
Query<Map> queryObject = getSession().createQuery(hql,Map.class);
产生的,而下述代码也不完美
//hibernate6不建议使用这样的语句
Query<Map<String,Object>> queryObject = getSession().createQuery(hql);
//这样的代码编译出错
Query<Map<String,Object>> queryObject = getSession().createQuery(hql,Map.class);
第二个警告,个人估计也是因为queryObject.unwrap(Query.class)中的Query 没有指定类型导致的,毕竟原型是Query
queryObject.unwrap(Query.class).setTupleTransformer((tuple, aliases)->{
Map<String, Object> map=new HashMap<>();
map.put(aliases[0], tuple[0]);
return map;
});