Querydsl本机jpa查询返回实体而不是对象数组

我在当前项目中使用 QueryDSL ,由于 jpql 的限制,在一种情况下,我需要使用本机查询而不是jpa。

非常幸运的是,只需从JPAQuery切换到JPASQLQuery,就可以很容易地从一个交换到另一个,并保留api抽象层,但是在我这样做之后,jpa实体不再映射为结果类型。

示例:

使用JPAQuery

QPriceModel pm = QPriceModel.priceModel;

List<PriceModel> fetch = new JPAQuery<PriceModel>(entityManager)
    .select(pm)
    .from(pm)
    .fetch();

将产生适当的实体作为结果类型:

Querydsl本机jpa查询返回实体而不是对象数组

但是JPASQLQuery

QPriceModel pm = QPriceModel.priceModel;

List<PriceModel> fetch = new JPASQLQuery<PriceModel>(entityManager,new OracleTemplates())
    .select(pm)
    .from(pm)
    .fetch();

只会按原样返回列数组

Querydsl本机jpa查询返回实体而不是对象数组

有什么方法可以强制JPASQLQuery返回实体而不手动映射它们?

我正在使用QUERY_DSL_VERSION = 4.2.1


TLDR

查询dsl从JPAQuery切换到JPASQLQuery后不再映射jpa实体

asdg85171683 回答:Querydsl本机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);

这将从您的选择语句中产生一个可解析的实体

本文链接:https://www.f2er.com/3072373.html

大家都在问