【问题标题】:NativeQuery mapping with @SqlResultSetMapping with multiple @Entity classes, is it possible?NativeQuery 映射与 @SqlResultSetMapping 与多个 @Entity 类,这可能吗?
【发布时间】:2020-02-14 08:21:57
【问题描述】:

我有一个包含 2 个实体类数据的本地查询,我如何通过 @SqlResultSetMapping 将该数据映射到实体类? 例如

Native query:- select customer.name, address.area from customer, address where customer.id=address.custid;

2 实体类,如客户和地址,名称作为客户中的变量,区域作为地址实体类中的变量。

Customer class:
@Entity
public class Customer {
    @Id
    private String name;
    getters and setters
.....
.....
.....
}

Address Class entity:
@Entity
public class Address{
    @Id
    private String area;
    getters and setters
.....
.....
.....
}

要将本机查询与实体类映射,可以通过在实体中提供@SqlResultSetMapping 并在本机查询中提供映射名称来完成

Query query = entityManager.createNativeQuery(sbQuery, "checkInfoMapping");

它将检查映射名称并映射到相应的实体类,这可以针对单个实体类完成。

如果我有来自 2 个实体类的本机查询的数据,是否可以完成,如果可以,我如何将其映射到具有本机查询的实体类?

【问题讨论】:

    标签: java spring hibernate hibernate-mapping spring-boot-jpa


    【解决方案1】:

    你应该这样做:

    @SqlResultSetMapping(
       name = "checkInfoMapping",
       classes = {
          @ConstructorResult(targetClass = ResultInfo.class,
             columns = {
                @ColumnResult(name = "cust_name", type = String.class),
                @ColumnResult(name = "adr_area", type = String.class)
             }
          )
       }
    )
    @Entity
    @Table(name = "TST_CUSTOMER")
    public class Customer {
    
        @Id
        @Column(name = "cust_id")
        private Long id;
    
        @Column(name = "cust_name")
        private String name;
    
        ...
    }
    
    
    @Entity
    @Table(name = "TST_ADDRESS")
    public class Address{
    
        @Column(name = "adr_area")
        private String area;
    
        @ManyToOne
        @JoinColumn(name = "adr_cust_id")
        private Customer customer;
        ...
    }
    
    // this is not entity, just dto class
    public class ResultInfo
    {
       private String name;
       private String area;
    
       public ResultInfo(String name, String area)
       {
          this.name = name;
          this.area = area;
       }
       // ...
    }
    

    还有查询:

    List<ResultInfo> resultList = entityManager.createNativeQuery(
       "select cust_name, adr_area from TST_CUSTOMER, TST_ADDRESS where TST_CUSTOMER.cust_id = TST_ADDRESS.adr_cust_id",
       "checkInfoMapping")
       .getResultList();
    

    【讨论】:

    • 感谢您的信息,您所说的是正确的,但我正在检查是否有可能直接使用本机查询映射多个实体类,就像我们使用单个本机查询映射一样,因为我有非常复杂的查询要在我的应用程序中映射,我已经通过迭代并将单个结果设置为多个实体类变量来完成,我只是想知道它是否可以通过 sqlresultmapping 来完成。
    • 我不确定你是否理解你想要的。在我的示例中,查询与您的完全一样。我已经展示了如何映射这个查询结果。对于更复杂的情况,您也可以这样做。
    • @sumanth 也可以看看this
    • 您可以在此处查看带有 @SqlResultSetMapping、多个实体和 @FieldResult 的示例(示例 607. Joined-entities NamedNativeQuery)。也许它会更适合您的需求。
    • 示例 607 完全符合我的需要,非常感谢!
    【解决方案2】:

    最简单的方法是在您的本机查询中使用 JOIN,如下所示。

    Native query :- select c.name,a.area from customer c JOIN address a ON c.id = a.custid

    因此您只需提供客户实体的结果集映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2011-07-31
      • 1970-01-01
      • 2018-10-21
      • 2019-09-03
      相关资源
      最近更新 更多