Соединить две таблицы с Hibernate - PullRequest
0 голосов
/ 06 июня 2018

Я хочу создать DAO, который представляет собой объединение двух таблиц с Java Hibernate.Вот SQL, который я хотел бы представить (в случае Postgres 9.6 это важно):

SELECT tableOneValue, tableTwoValue
FROM table_one, table_two
WHERE table_one_filter = 2 AND table_one_id = table_two_id;

Эти таблицы имеют отношение OneToOne.

Table1.java

@Entity
@Data
@Table(name="table_one")
public class TableOneDao implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "table_one_id")
    private int tableOneId;

    @Column(name = "table_one_value")
    private String tableOneValue;


    @Column(name = "table_one_filter")
    private int tableOneFilter;
}

Table2.java

@Entity
@Data
@Table(name="table_two")
public class TableTwoDao implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "table_twp_id")
    private int tableTwpId;

    @Column(name = "table_two_value")
    private String tableTwoValue;
}

Я очень плохо знаком с гибернацией, поэтому, возможно, это неправильный способ думать с ним.Я хотел бы определить класс SomeDao, в котором я могу сделать: daoManager.findAll(SomeDao.class, Pair.of("tableOneFilter", 2));

Это вернет List<SomeDao>, где мы получим все строки, которые удовлетворяют tableOneFilter == 2.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Вот запрос JPA, который будет работать с существующей структурой сущностей с последней версией hibernate.

SELECT t1.tableOneValue, t2.tableTwoValue FROM TableOneDao AS t1 ПРИСОЕДИНЯЙТЕСЬ к TableTwoDao AS t2 ON t1.table_one_id =t2.table_two_id ГДЕ t1.table_one_filter =?

0 голосов
/ 06 июня 2018

Вы можете написать оператор JPQL, который намного лучше.Вот пример решения:

SELECT NEW com.test.package.dao(t1.valueOne, t2.valueTwo)
FROM table_one t1 JOIN table_two t2
WHERE t1.filter = 2 AND t1.id = t2.id;

Пожалуйста, обратитесь к этой ссылке и перейдите к разделу, где упоминается Классы результата (выражения конструктора) .Надеюсь, поможет.Спасибо.

0 голосов
/ 06 июня 2018

Вам необходимо использовать аннотации @OneToOne и @JoinColumn.

Обратите особое внимание на отображение атрибута userDetail.

Например, класс пользователя:

@Entity
@Table(name = "USERS")
public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "USR_ID")
   private long id;

   @Column(name = "USERNAME", nullable = false, unique = true)
   private String username;

   @Column(name = "PASSWORD")
   private String password;

   @OneToOne(cascade = CascadeType.ALL)
   @JoinColumn(name="USR_DET_ID")
   private UserDetail userDetail;

   // Add Constructor, Setter and Getter methods
}

И этот класс данных пользователя:

@Entity
@Table(name = "USER_DETAILS")
public class UserDetail {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "USR_DET_ID")
   private long id;

   @Column(name = "FIRST_NAME")
   private String firstName;

   @Column(name = "LAST_NAME")
   private String lastName;

   @Column(name = "EMAIL")
   private String email;

   @Column(name = "DBO")
   private LocalDate dob;

   // Add Constructor, Setter and Getter methods
}

Проверьте полный код здесь .

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