본문 바로가기

Programming!

Spring Data JPA + QueryDSL에서 커스텀 DTO사용시 groupby, count Spring Data JPA + QueryDSL에서 커스텀 DTO사용시 groupby, count()를 사용하다보면 의도치 않은 오류인.. "Unsupported expression count(..)" 요놈을 만나게 된다. 물론 sum이든 뭐든.. 예로, 검색어를 저장하는 entity table이 아래와 같다고 해보자. id, keyword 그럼 이놈을 목록으로 보여줄때 keyword는 group으로 묶어주고 해당 키워드의 카운트를 보고 싶을 경우 "select keyword, count(keyword) from keywords group by keyword" 뭐 이런 형태가 될 것이고, entity는 커스텀 dto를 쓰게 된다. @Data @NoArgsConstructor @AllArgsConstruc.. 더보기
JPA 코드성 데이터의 매핑 이런 방식을 처리하는 방법은 많다. 그중 하나만 참고. 우성 Forum / ForumCategory Entity가 있다고 치자. forum id PK forumCategoryId forum_category id PK name 조건으로 하나의 forum이 하나의 category만 가질 수 있는 형태로 보자. 이경우 OneToOne이 바로 나오기는 하는데, 어쩐지 MapsId 나 OneToOne 자체에 대해 고민도 하고 그렇게 된다.. 근데 어짜피 카테고리의 관리 주체도 일반적인 사용자가 아니고 관리자이며, forum의 저장시 forum_category의 데이터 저장은 불필요하기 때문에(forum 테이블의 forumCategoryId 만 저장되면 된다.) 그런 고민이 과연 필요할까 싶다.?? 그냥 이 경우는.. 더보기
단일테이블의 Tree 구조를 위한 Self Join Oracle의 tree 구조 start with/connect by 형태와 동일하게 구현하고자 할 경우, JPA도 Self Releastion으로 처리할 수 있다. 가령 ForumCategory Entity가 존재한다면 다음과 같이 처리된다. public class ForumCategory { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; @Where(clause = "deleted='N'") @ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY) @JoinColumn(name = "parentId") private ForumCa.. 더보기
JPA - 필드에 Trim 적용하기 두가지의 방법이 있다. 첫번째는 JBoss-Hibernate에서 제공되는 @ColumnTransformer를 사용하는 방법과 Listener를 적용하는 방법. DB에 종속적인 모델이지만, 개인적으로는 첫번째 방법인 ColumnTransformer를 추천한다. ColumnTransformer를 적용하는 방법. .. @ColumnTransformer(write="trim(?)") @Column(name = "title", nullable = false) private String title;.. TrimListener를 만들어 적용하는 방법 @Trim Annotaion을 지정한다고 보면, Annotaion의 적용 대상은 method나 field일 것이다. 그러니 @interface의 적용 대상을 field,.. 더보기
guava의 Iterables.isEmpty java null.. lib들을 사용하다보면 어떤 놈들은 null처리가 되어 있는 놈들이 있는가 하면, 그냥 null exception 을 내뱉는 놈들도 있다. 가령 guava의 Iterables.isEmpty(Iterable..)를 무심결에 썼는데 nullpointerexception 을 내뱉에 버린다. /** * Determines if the given iterable contains no elements. * * There is no precise {@link Iterator} equivalent to this method, since * one can only ask an iterator whether it has any elements remaining * (which one does usin.. 더보기