【问题标题】:Querydsl native jpa query return entities instead of object arrayQuerydsl 本机 jpa 查询返回实体而不是对象数组
【发布时间】:2023-03-07 15:14:01
【问题描述】:

我在当前项目中使用 QueryDSL,在一种情况下,由于 jpql 的限制,我需要使用原生查询而不是 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();

将仅按原样返回列数组

有没有办法强制JPASQLQuery返回实体而不手动映射它们?

我正在使用 QUERY_DSL_VERSION=4.2.1


TLDR

JPAQuery 切换到JPASQLQuery 后,Query dsl 不再映射 jpa 实体

【问题讨论】:

    标签: java jpa orm spring-data-jpa querydsl


    【解决方案1】:

    所以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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-01
      • 2014-06-01
      • 2023-03-17
      • 2021-02-27
      • 2021-09-20
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      相关资源
      最近更新 更多