Querydsl 原生 jpa 查询 return 个实体而不是对象数组
Querydsl native jpa query return entities instead of object array
我在当前项目中使用 QueryDSL,在一个实例中,由于 jpql[=54,我需要使用本机查询而不是 jpa 查询=] 限制。
谢天谢地,只需从 JPAQuery
切换到 JPASQLQuery
,就可以很容易地从一个交换到另一个并保持 api 抽象层,但是在我这样做之后 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();
只会 return 列数组
有什么方法可以强制 JPASQLQuery
到 return 个实体而不用手动映射它们?
我正在使用 QUERY_DSL_VERSION=4.2.1
TLDR
从 JPAQuery
切换到 JPASQLQuery
后,查询 dsl 不再映射 jpa 实体
所以似乎 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 语句
中生成一个已解析的实体
我在当前项目中使用 QueryDSL,在一个实例中,由于 jpql[=54,我需要使用本机查询而不是 jpa 查询=] 限制。
谢天谢地,只需从 JPAQuery
切换到 JPASQLQuery
,就可以很容易地从一个交换到另一个并保持 api 抽象层,但是在我这样做之后 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();
只会 return 列数组
有什么方法可以强制 JPASQLQuery
到 return 个实体而不用手动映射它们?
我正在使用 QUERY_DSL_VERSION=4.2.1
TLDR
从 JPAQuery
切换到 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 语句
中生成一个已解析的实体