iceheartboy2015 2023-03-17 11:00 采纳率: 0%
浏览 26

hibernate6 如何优雅的返回List<Map<String,Object>

我要封装一个基于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;
        });
  • 写回答

5条回答 默认 最新

  • 「已注销」 2023-03-17 11:09
    关注

    参考GPT和自己的思路:

    对于第一个警告,可以使用泛型来消除,将函数签名改为:

    public List<Map<String, Object>> findMap(String hql, Object... values) throws Exception {
    

    同时,需要将第2行的代码改为:

    Query<Map<String, Object>> queryObject = getSession().createQuery(hql);
    

    对于第二个警告,需要将第13行的代码改为:

    queryObject.unwrap(org.hibernate.query.Query.class).setTupleTransformer((tuple, aliases)->{
    

    使用完整的泛型类型,以及使用org.hibernate.query.Query代替原来的Query,可以消除警告。

    如果将第2行的代码改为Query<Map<String,Object>> queryObject = getSession().createQuery(hql);,则不需要使用元素转换器了,不需要第13-17行的代码。直接返回queryObject.list()即可。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补