java - Querydsl 本机 jpa 查询返回实体而不是对象数组
问题描述
我在当前项目中使用QueryDSL ,在一种情况下,由于jpql的限制,我需要使用本机查询而不是 jpa 之一。
值得庆幸的是,从一个切换到另一个非常容易,只需切换 fromJPAQuery
即可保留 api 抽象层JPASQLQuery
,但是在我这样做之后,jpa
实体不再映射为结果类型。
例子:
使用JPAQuery
:
QPriceModel pm = QPriceModel.priceModel;
List<PriceModel> fetch = new JPAQuery<PriceModel>(entityManager)
.select(pm)
.from(pm)
.fetch();
将产生适当的实体作为结果类型:
但JPASQLQuery
QPriceModel pm = QPriceModel.priceModel;
List<PriceModel> fetch = new JPASQLQuery<PriceModel>(entityManager, new OracleTemplates())
.select(pm)
.from(pm)
.fetch();
只会按原样返回列数组
有没有办法强制JPASQLQuery
返回实体而不手动映射它们?
我正在使用 QUERY_DSL_VERSION=4.2.1
TLDR
JPAQuery
Query dsl 切换后不再映射 jpa 实体JPASQLQuery
解决方案
所以似乎默认情况下JPASQLQuery
不使用DefaultQueryHandler
,需要将类型解析器传递给entityManager
这里看到的
https://github.com/querydsl/querydsl/blob/QUERYDSL_4_2_1/querydsl-jpa/src/main/java/com /querydsl/jpa/sql/AbstractJPASQLQuery.java#L105-L113
我的解决方案是将 传递DefaultQueryHandler
给JPASQLQuery
Configuration configuration = new Configuration(new OracleTemplates());
new JPASQLQuery<>(entityManager, configuration, DefaultQueryHandler.DEFAULT);
这将从您的 select 语句中生成一个已解析的实体
推荐阅读
- python - 我可以将 csv 文件数据粘贴到 excel 中吗,因为 excel 已经有一些格式,
- python - 在“if”语句中使用“in”和“is”有什么区别?
- c++ - 为什么我们在vs代码中写C++代码时不能通过一个变量来定义数组大小?
- html - 如何在我的 html 页面上移动图片?
- cors - 在服务人员中获取 CORS 请求
- c++ - 如何修复此代码对一些测试用例的错误答案?
- c++ - 如何在C++中使用future和promise从函数线程获取返回值
- json - 如何在 Django 中的 JSONField 上运行引用特定元素的 FOR 循环
- c# - Ajax get 调用不会传递参数
- python - 如何在一个表达式中合并两个复杂的字典?