【问题标题】:JPA - single query with multiple new objects [duplicate]JPA - 具有多个新对象的单个查询[重复]
【发布时间】:2021-05-03 03:17:05
【问题描述】:

是否可以在单个查询中初始化多个对象?我正在尝试将多个属性映射到相应的 DTO,但出现语法错误。查询如下:

em.createQuery("SELECT "
                                      + "new com.x.y.z(fte.attr1 "
                                      + "fte.attr2, fte.attr3),"

                                      + "new com.x.y.a(fet.attr4, fet.attr5,"
                                      + "fet.attr6, fet.attr7, fet.attr8, fet.attr9), "

                                      + "new com.x.y.b(fte.attr10,"
                                      + " fte.attr11, fte.attr12, fte.attr13, fte.attr14), "

                                      + "new com.x.y.c(fte.attr15, "
                                      + "fte.attr16, v.attr17, v.attr18) "

                                      + "FROM Table1 fte "
                                      + "LEFT JOIN Table2fet ON fte.attr1= fet.attr1 AND fte.attr1= fet.attr1"
                                      + "LEFT JOIN Table3 v ON v.attr1= fte.attr1"
                                      + "WHERE fte.attr1= :attr1 AND fte.attr1= :attr1",
                              Object[].class)
                .getResultStream()

但是 JPA 指出问题 org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: , 第 1 行附近的第 115 列被解析为 new com.x.y.a 位置

【问题讨论】:

  • 根据那里发布的答案,JPA 规范似乎允许这样做,但 Hibernate 不允许
  • 是的,JPA 标准确实允许这样做,并且快速切换到 EclipseLink 似乎也可以,但无论出于何种原因,Hibernate 都不允许这样做

标签: hibernate jpa jpql


【解决方案1】:

似乎 Hibernate 不支持这一点,但我认为这是 Blaze-Persistence Entity Views 的完美用例。

我创建了该库以允许在 JPA 模型和自定义接口或抽象类定义模型之间轻松映射,例如 Spring Data Projections on steroids。这个想法是您按照自己喜欢的方式定义目标结构(域模型),并通过 JPQL 表达式将属性(getter)映射到实体模型。

使用 Blaze-Persistence Entity-Views 的 DTO 模型可能如下所示:

@EntityView(User.class)
public interface UserDto {
    @IdMapping
    Long getId();
    String getName();
    Set<RoleDto> getRoles();

    @EntityView(Role.class)
    interface RoleDto {
        @IdMapping
        Long getId();
        String getName();
    }
}

查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。

UserDto a = entityViewManager.find(entityManager, UserDto.class, id);

Spring Data 集成让您可以像使用 Spring Data Projections 一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

最好的是,它只会获取实际需要的数据。

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2021-10-26
    • 2021-09-14
    • 2011-09-15
    • 2020-11-04
    相关资源
    最近更新 更多