Hibernate 명명된 쿼리 - 3개의 테이블 조인
-
28-10-2019 - |
문제
나는 3 개의 콩을 가지고 있습니다 :조직, 역할, 사용자
역할 - 조직 관계 - @ManyToOne
역할 - 사용자 관계 - @ManyToMany
조직 :
@Entity
@Table(name = "entity_organization")
public class Organization implements Serializable {
private static final long serialVersionUID = -646783073824774092L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
Long id;
String name;
@OneToMany(targetEntity = Role.class, mappedBy = "organization")
List<Role> roleList;
...
역할 :
@Entity
@Table(name = "entity_role")
public class Role implements Serializable {
private static final long serialVersionUID = -8468851370626652688L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
Long id;
String name;
String description;
@ManyToOne
Organization organization;
...
사용자 :
@Entity
@Table(name = "entity_user")
public class User implements Serializable {
private static final long serialVersionUID = -4353850485035153638L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
Long id;
@ManyToMany
@JoinTable(name = "entity_user_role",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
List<Role> roleList;
...
따라서 지정된 사용자에 대한 모든 조직을 가져와야 합니다(먼저 모든 사용자 역할을 선택하고 이 역할이 있는 모든 조직을 선택해야 함).
이 논리를 실현하는 SQL 문이 있습니다(예:ID = 1인 사용자를 선택합니다.
SELECT * FROM entity_organization AS o
INNER JOIN entity_role r ON r.organization_id = o.id
INNER JOIN entity_user_role ur ON ur.role_id=r.id
WHERE ur.user_id = 1
최대 절전 모드 명명된 쿼리 메커니즘을 사용하여 이를 어떻게 구현할 수 있나요?감사해요!
해결책
@NamedQuery
@NamedQuery
엔티티 클래스에 다음과 같은 Organization
를 만들었습니다.
라코 디스
(표준 JPA 주석을 사용했지만 제공자는 Hibernate였습니다.)
테스트
내가 실행 한 테스트입니다. 라코 디스
아래 표와 샘플 데이터를 사용하면 다음과 같은 결과를 얻을 수 있습니다. 라코 디스
효과가 있는지 확인하세요.
표 라코 디스
( 당신 과 약간 다른 것을 사용했지만 너무 중요하지는 않습니다.)
샘플 데이터 라코 디스
다른 팁
아래와 같이 HQL을 사용해 보세요.
select ur.roleList.organization from User ur where ur.id = 1
그것은 당신에게 줄 것입니다 List<Organization>
.
제휴하지 않습니다 StackOverflow