post_template

[SpringBoot] 엔티티 내부 객체를 JPA 레포지토리에서 사용

개요

현재 단방향 관계로 사용중인 엔티티가 있는데,

이 엔티티에서 다른 테이블을 가르키는 객체를 이용해서 정렬을 하는 방법을 정리한다

Entity 관계

현재 엔티티 관계는 다음과 같다

Board(게시글)와 Comment(댓글)에서 좋아요나 싫어요를 할 수 있는데 이를 각각 엔티티에서 담지 않고 Likes라는 테이블에서 관리를 하고자 하였다.

그렇게 할려고 각 Board와 Comment에서 Likes를 단방향관계로 묶어주었다

Entity 코드

코드는 다음과 같으며 주석으로 **표시한 부분을 주로 보면 될 것 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

@Getter
@Setter
@NoArgsConstructor
@Entity
@DynamicInsert
@Table(name = "BOARD")
public class Board extends BaseTimeEntity

{

//gallery 이름, user 이름으로 foregin key 설정할거임 이거 칼럼에서 추가하는거 있잖아 그거 하자
@Column(nullable = false, length = 45)
private String gallery;

@Column(nullable = false)
private String user;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "content_idx")
private Long contentIdx;

@Column(nullable = false, length = 45)
private String title;

@Column(columnDefinition = "text", nullable = false)
private String content;

//***********************************************
@OneToOne(cascade = CascadeType.ALL)
private Likes likes;
//***********************************************
@Column(length = 80, nullable = false)
private String password;

@Column(columnDefinition = "tinyint(1) default 0", name = "is_logged_user",nullable = false)
private Long isLoggedUser;
//이하생략
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Getter
@Entity
@EntityListeners(AuditingEntityListener.class)
@DynamicInsert
@Table(name = "COMMENT")
@NoArgsConstructor
public class Comment extends BaseTimeEntity
{
@Id
@Column(name = "comment_idx")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long contentIdx;

@Column(name = "board_idx",nullable = false)
Long boardIdx;

@Column(nullable = false)
String gallery;

@Column(nullable = false)
String user;

@Column(nullable = false)
String content;

@Column(name = "comment_password",nullable = false,length = 80)
String commentPassword;

@Column(columnDefinition = "tinyint(1) default 0",nullable = false,name = "is_logged_user")
Long isLogged;

//***********************************************
@OneToOne(cascade = CascadeType.ALL)
private Likes likes;
//***********************************************

//이하생략
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Entity
@Getter
@NoArgsConstructor
@DynamicInsert
@Table(name= "likes")
@IdClass(LikesID.class)
public class Likes implements Serializable
{
@Column(name = "is_comment")
@Id
private boolean isComment;

//board,comment 둘의 개추들 모두 담음
@Id
@Column(name = "content_idx",nullable = false)
private Long contentIdx;

@Column(columnDefinition = "bigint default 0")
private Long like;

@Column(columnDefinition = "bigint default 0")
private Long dislike;

Repository에서 사용

1
2
3
4
5
public interface BoardRepository extends JpaRepository<Board, Long>
{
List<Board> findTop10ByOrderByLikesLikeDesc();
}

findTop10 : 정렬 기준이 가장 높은 10가지를 가져온다

OrderByLikesLike : Board 엔티티의 Likes 객체의 Like를 기준으로 내림차순 정렬을 한다

마무리

레포지토리에서 객체안의 값을 기준으로 정렬할려면 어떻게 해야하지? 고민했는데

LikesLike처럼 이어서 사용하면 되는 것이었다

참고

https://stackoverflow.com/questions/55579240/spring-data-find-by-property-of-a-nested-object/55579268