首页 > 解决方案 > 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

JPAQueryQuery dsl 切换后不再映射 jpa 实体JPASQLQuery

标签: javajpaormspring-data-jpaquerydsl

解决方案


所以似乎默认情况下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

我的解决方案是将 传递DefaultQueryHandlerJPASQLQuery


        Configuration configuration = new Configuration(new OracleTemplates());

        new JPASQLQuery<>(entityManager, configuration,  DefaultQueryHandler.DEFAULT);

这将从您的 select 语句中生成一个已解析的实体


推荐阅读