получение записей второго объекта через соединение - PullRequest
0 голосов
/ 28 июня 2019

У меня есть два приведенных ниже pojos, которые имеют отношения один ко многим. Мой запрос заключается в том, что прямо сейчас через SqlResultSetMapping я могу получить результаты первого класса, который является Com, но внутри Com есть ссылка на SubCom, но в результате мой текущий SqlResultSetMapping вывод, который я получаю, является идеальным, но он содержит нуль для SubCom, поэтому, пожалуйста, посоветуйте, как мне изменить мой SqlResultSetMapping, чтобы я также получал значение SubCom, я должен разработать отдельный SqlResultSetMapping для SubCom.

Первое Pojo показано ниже

@SqlResultSetMapping(
        name = "firstQuery",
        classes = @ConstructorResult(
                targetClass = com.entity.Com.class,
                columns = {
                        @ColumnResult(name = "com_Id" , type = Integer.class),
                        @ColumnResult(name = "Cescription" , type = String.class),
                        @ColumnResult(name = "name" , type = String.class)}))




@Entity
@Data
@Table(name = "COM")
public class Com implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)

        @Column(name = "com_Id")
        private Integer ComId;

          private String Cescription;
        private String name;




    @OneToMany(mappedBy = "Com", cascade = CascadeType.ALL)
    @ToString.Exclude
    private List<SubCom> subCom = new ArrayList<>(); // *** Has a refrence


    //**** Constructor  

       public Com( Integer ComId , String Cescription,  String name) {
        this.ComId=ComId;
        this.Cescription = Cescription;
        this.name = name;

    }


}

Мое второе pojo -

@Entity
@Table(name = "sub_com")
@Data
public class SubCom implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "sub_com_id")
  private Integer Id;

  private String name;
  private String Cescription;


  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
  @JoinColumn(name = "com_Id")
  private Com com; //****** Refernce to above table.

  }

Я выполнил собственный SQL-запрос, который выглядит следующим образом

SELECT
    c.com_Id,
    c.Cescription,
    sc.sub_domain_id
    FROM Com AS c
         INNER JOIN SubCom AS sc ON c.com_Id  = sc.com_Id

1 Ответ

0 голосов
/ 28 июня 2019

Вы должны выбрать все необходимые столбцы для построения обеих сущностей.

Чем будет выглядеть отображение в этом примере:

@NamedNativeQuery(
    name = "find_person_with_phones_by_name",
    query =
        "SELECT " +
        "   pr.id AS \"pr.id\", " +
        "   pr.name AS \"pr.name\", " +
        "   pr.nickName AS \"pr.nickName\", " +
        "   pr.address AS \"pr.address\", " +
        "   pr.createdOn AS \"pr.createdOn\", " +
        "   pr.version AS \"pr.version\", " +
        "   ph.id AS \"ph.id\", " +
        "   ph.person_id AS \"ph.person_id\", " +
        "   ph.phone_number AS \"ph.number\", " +
        "   ph.phone_type AS \"ph.type\" " +
        "FROM Person pr " +
        "JOIN Phone ph ON pr.id = ph.person_id " +
        "WHERE pr.name LIKE :name",
    resultSetMapping = "person_with_phones"
)
 @SqlResultSetMapping(
     name = "person_with_phones",
     entities = {
         @EntityResult(
             entityClass = Person.class,
             fields = {
                 @FieldResult( name = "id", column = "pr.id" ),
                 @FieldResult( name = "name", column = "pr.name" ),
                 @FieldResult( name = "nickName", column = "pr.nickName" ),
                 @FieldResult( name = "address", column = "pr.address" ),
                 @FieldResult( name = "createdOn", column = "pr.createdOn" ),
                 @FieldResult( name = "version", column = "pr.version" ),
             }
         ),
         @EntityResult(
             entityClass = Phone.class,
             fields = {
                 @FieldResult( name = "id", column = "ph.id" ),
                 @FieldResult( name = "person", column = "ph.person_id" ),
                 @FieldResult( name = "number", column = "ph.number" ),
                 @FieldResult( name = "type", column = "ph.type" ),
             }
         )
     }
 ),

Дополнительную информацию можно найти в документации по Hibernate:https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html

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