반응형
SELECT * FROM DUAL
WHERE GUBUN = 'A'
AND CATEGORY IN (1,2,3)

현재 프로젝트에서 JPA를 사용하고 있어서 몇몇 기능을 추가하면서 JAP를 사용해봤습니다.

기존에는 ExampleMatcher를 사용하여 단순한 where을 만들고 있었는데 IN을 추가하려고 하니 방법을 못 찾아서 Specifications를 사용하게 되었어요 혹시라도 ExampleMatcher를 사용해 구현하신 분.. 댓글로 알려주시면 감사하겠습니다.

ExampleMatcher.matching().withIgnoreNullValues().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);

기존에는 단순히 title,name등 일치하는 거만 사용을 하여 ExampleMatcher 적용을 한거같아요.

SELECT * FROM DUAL
WHERE CATEGORY IN (1,2)
AND TITLE = 'A'

이런 결과를 을 얻으려고 Specifications를 사용하게 되었어요.

public static Specification<Document> category(String... categorys) {
		
	return new Specification<Document>() {

		@Override
		public Predicate toPredicate(Root<Document> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            	
			return root.get("categoryCd").in(categorys);

		}

	};
        
}
	
public static Specification<Document> fieldEquals(String searchField,String searchData) {
		
	return new Specification<Document>() {

		@Override
		public Predicate toPredicate(Root<Document> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            	
			return cb.equal(root.get(searchField), searchData);

		}

	};
        
}
	
public static Specification<Document> fieldLike(String searchField,String searchData) {
		
	return new Specification<Document>() {

		@Override
		public Predicate toPredicate(Root<Document> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            	
			return cb.like(root.get(searchField), "%" + searchData + "%");

		}

	};
        
}

category는 배열로 받아서 in을 사용하게 하였어요.

fieldEquals는 단순히 = 비교반 하기 위해 만들었어요 Column = Value로 실행하게 하였어요.

지금은 사용하지는 않지만 like절도 만들었어요 Column like '% value%'로 실행하게 하였어요.

사용하는 Service에서는

Specifications<Document> spec = Specifications.where(DocumentWhere.category(documentCategoryCds));
spec.and(DocumentWhere.fieldLike("title", document.getTitle()));

이런 식으로 where 첫 문장을 만들고 and로 title = value를 만들어서 findAll로 실행을 하였어요.

실행 로그로 위 SQL처럼 원하는 방식으로 실행이 되었어요. 위 Method처럼 원하는 게 있으면 구현을 하여 직접 적용을 해야 할 거 같아요. 사용하면서 아직 적응이 안되어서 Mybatis보다는 어렵네요.... Insert, Update에서는 간단히 사용이 가능한 거 같은데 복잡한 Query일 경우 @Query를 사용하여 결과를 가져오는 것도 나쁘지 않은 거 같아요

반응형

+ Recent posts