Возможно ли отображение NativeQuery с помощью @SqlResultSetMapping с несколькими классами @Entity? - PullRequest
1 голос
/ 14 февраля 2020

У меня есть ситуация, когда у меня есть один собственный запрос, который содержит данные двух классов сущностей. Как я могу сопоставить эти данные с классами сущностей с помощью @SqlResultSetMapping? Например

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

2 Классы сущностей, такие как customer и address, с именем в качестве переменной в customer и area в качестве переменной в классе сущности адреса.

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 в сущности и присвоив имя сопоставления в nativeQuery

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

, он проверит имя сопоставления и сопоставит с соответствующим класс сущностей, это можно сделать для одного класса сущностей.

Можно ли это сделать, если у меня есть данные из нативного запроса 2 классов сущностей, если да, как я могу сопоставить его с классом сущности с нативным запросом?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Вы должны сделать что-то вроде этого:

@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();
0 голосов
/ 14 февраля 2020

Самый простой способ - просто использовать JOIN в своем собственном запросе, как показано ниже.

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

И, следовательно, вам нужно просто предоставить сопоставление набора результатов для сущности клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...