有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java NativeQuery映射和@SqlResultSetMapping以及多个@Entity类,是否可能?

有一种情况,我有一个本机查询,其中包含两个实体类的数据,如何通过@SqlResultSetMapping将该数据映射到实体类? 例如

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

2个实体类,如customer和address,其中name在customer中作为变量,area在address实体类中作为变量

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
.....
.....
.....
}

要将本机查询映射到entity类,可以在entity中提供@SqlResultSetMapping并在nativeQuery中提供映射的名称

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

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

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


共 (2) 个答案

  1. # 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();
    
  2. # 2 楼答案

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

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

    因此,您只需在客户实体上提供结果集映射