如何为Hibernate Mutiny原生查询结果指定非实体类类型
解决方案
方案1:原生查询直接映射到自定义视图(构造函数方式)
如果MyListView有匹配查询列的构造函数,可直接在原生SQL中使用构造函数语法,让Hibernate Mutiny自动完成映射:
// 假设MyListView存在构造函数:public MyListView(Long id, String name, Integer age) String sql = "SELECT new com.yourpackage.MyListView(u.id, u.name, u.age) FROM users u WHERE u.status = 1"; Mutiny.Session session = ...; // 获取Mutiny会话 Uni<List<MyListView>> result = session.createNativeQuery(sql, MyListView.class) .getResultList();
注意:
- 构造函数参数顺序必须与SQL查询的列顺序完全一致
MyListView无需是JPA实体,只要有public的对应构造函数即可- 若SQL列名与构造函数参数名不匹配,需给列添加别名(如
SELECT u.user_id AS id ...)
方案2:手动遍历Object数组转换
Hibernate Mutiny执行原生查询返回的List<Object>中,每个元素本质是Object数组(对应查询行的各列值),可直接强转后手动赋值:
String sql = "SELECT id, name, age FROM users WHERE status = 1"; Mutiny.Session session = ...; Uni<List<MyListView>> result = session.createNativeQuery(sql) .getResultList() .map(objectList -> { List<MyListView> viewList = new ArrayList<>(); for (Object row : objectList) { Object[] columns = (Object[]) row; MyListView view = new MyListView(); view.setId((Long) columns[0]); view.setName((String) columns[1]); view.setAge((Integer) columns[2]); viewList.add(view); } return viewList; });
这种方式无需依赖Hibernate特殊配置,完全手动控制转换逻辑,适配复杂字段映射场景。
方案3:使用@SqlResultSetMapping定义映射规则
通过JPA的@SqlResultSetMapping注解定义结果集到MyListView的映射规则,再在查询中指定映射名称:
首先在任意实体类上添加映射注解:
@SqlResultSetMapping( name = "MyListViewMapping", classes = @ConstructorResult( targetClass = MyListView.class, columns = { @ColumnResult(name = "id", type = Long.class), @ColumnResult(name = "name", type = String.class), @ColumnResult(name = "age", type = Integer.class) } ) ) @Entity public class User { // 实体类内容 }
然后在查询中使用该映射:
String sql = "SELECT id, name, age FROM users WHERE status = 1"; Mutiny.Session session = ...; Uni<List<MyListView>> result = session.createNativeQuery(sql, "MyListViewMapping") .getResultList();
该方式适合需要复用映射规则的场景,列与目标类属性的映射关系更清晰。
内容的提问来源于stack exchange,提问作者Gero Mendy
相关产品推荐
相关产品推荐

