java - Hibernate/JPA 将本机查询的结果映射到非实体持有实体
问题描述
我确实有 3 个实体并想交叉加入它们。因为我不需要为此创建一个新实体,所以我只想通过使用本机查询获取来映射:
EntityA{
...
String someValue;
}
EntityB{
...
String someValue;
}
EntityC{
...
String someValue;
}
和 CrossJoined 对象
CrossJoinedFoo{
EntityA entityA;
EntityB entityB;
EntityC entityC;
}
我像这样使用它:
private static final String _SELECT_CROSS_JOIN_ENTITIES = "SELECT * FROM "
+ "EntityA"
+ ", "
+ "EntityB"
+ ", "
+ "EntityC"
+ " WHERE (1=1) "
+ " AND " + "EntityA.someValue = :someValue"
+ " AND " + "EntityB.someValue = :someValue"
+ " AND " + "EntityC.someValue = :someValue";
Query query = entityManager.createNativeQuery(_SELECT_CROSS_JOIN_ENTITIES);
query.setParameter(":someValue", "foo");
我怎样才能实现这种行为?
解决方案
您可以进行 HQL 查询并使用结果类策略。只需记住向 CrossJoinedFoo 添加一个构造函数,以适当的顺序接受 3 个实体:
private static final String _SELECT_CROSS_JOIN_ENTITIES =
"SELECT new my.package.CrossJoinedFoo(a,b,c) FROM "
+ "EntityA a"
+ ", "
+ "EntityB b"
+ ", "
+ "EntityC c"
+ " WHERE (1=1) "
+ " AND " + "a.someValue = :someValue"
+ " AND " + "b.someValue = :someValue"
+ " AND " + "c.someValue = :someValue";
Query query = entityManager.createQuery(_SELECT_CROSS_JOIN_ENTITIES);
query.setParameter(":someValue", "foo");
List<CrossJoinedFoo> result = query.list();
请记住将包装更改为适当的包装。
推荐阅读
- shell - 如何在 shell 脚本中打印 HTTP 状态码?
- javascript - Squarespace 接受来自其他域的请求
- php - 从 MySQL 回显下一行
- javascript - Vue组件上的捏缩放问题
- apache - 为什么只有当我进入容器的 bash 时才能访问我的 Apache 默认页面?
- css - 从父组件css angular为子组件模板设置样式
- javascript - 如何在内容加载时为预加载器运行脚本
- javascript - Application Insights - 使用 href 作为“查看页面名称”是否正确?
- orientdb - Gremlin - 查找和连接子图
- python - PySimpleGUI:如何在调整窗口大小时实现元素/框架/列向右对齐(和调整大小)