Spring Data JPA 에서 in 조건 부 매개 변수 전달 방식
이 글 은 나중에 볼 수 있 도록 기록 하고 같은 문 제 를 만 나 고 있 는 친구 들 이 깨 우 침 을 줄 수 있 기 를 바 랍 니 다.만약 에 더 좋 은 방법 이 있 거나 제 방법 에 문제 가 있 으 면 알려 주 십시오.감사합니다.
다음은 두 가지 간단 한 방법 을 쓰 고 다음 부분 에 주의 하 세 요.
여기 서 저 는 HQL 에서 in 뒤의 매개 변수 문제 만 기록 하고 세부 적 인 조회 방법 과 관련 된 코드 는 생략 합 니 다.양해 해 주 십시오.
검색 인터페이스:
/**
** paramString : hql
** paramMap : hql
** start:
** max:
**/
public abstract List query(String paramString, Map paramMap, int start, int max);
방법 1:조합 조건뒤에 괄호 안에 몇 개의 인자 가 있 든 동적 연결 을 사용 하면 HQL 을 연결 하 는 과정 에서 코드 를 붙 이지 않 습 니 다.결 과 는 다음 과 같 습 니 다.
HQL
String hql = “select obj from Goods obj where obj.id in(:id_1,:id_2,id_3……)” ;
조회 조작
Map<String, Long> paramMap = new HashedMap();
paramMap.put(“id_1”,Long.valueOf(4));
paramMap.put(“id_2”, Long.valueOf(5));
~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
List<Goods> goods = goodsService.query(hql , paramMap, 1, 100);
이러한 동적 연결 방식 으로 연결 하면 데 이 터 를 조회 할 수 있 습 니 다.그러나 주의해 야 할 점 이 있 습 니 다.Object 가 초 류 로 서 큰 범 형 이 될 수 있다 는 것 을 잘 알 고 있 습 니 다.그러나 여기 서 paramMap 의 범 형 으로 된 후에 매개 변수 값 을 추가 할 때 실제 대상 에서 id 속성 유형 이 어떤 유형 이 라면 반드시 eg 로 전환 해 야 합 니 다.
paramMap.put(“id_1”,Long.valueOf(4)); ――――――( id Long )
방법 2:집합 사용HQL
String hql = “select obj from Goods obj where obj.id in(:id)”;
의 조회 동작:
Map<String, Object> paramMap = new HashedMap();
ArrayList<Object> list = new ArrayList<>();
list.add(Long.valueOf(4));
list.add(Long.valueOf(5));
paramMap.put(“id”, list);
List<Goods> goods = goodsService.query(“select obj from Goods obj where obj.gc.id in(:id)”, paramMap, -1, -1);
그리고 예전 의 방법 은 이렇게 쓰 는 것 도 문제 가 없 는 것 같 습 니 다.Object 는 초 류 이기 때문에 하나의 Long 은 일치 할 수 있 습 니 다.컴 파일 은 이상 하지 않 지만 달 린 후에 이 곳 에 방문 하면 문제 가 발생 할 것 입 니 다.구체 적 인 이상 은 보조금 입 니 다.직접 해 보 세 요.
Map<String, Object> paramMap = new HashedMap();
ArrayList<Object> list = new ArrayList<>();
list.add(4);
list.add(5);
paramMap.put(“id”, list);
List<Goods> goods = goodsService.query(“select obj from Goods obj where obj.gc.id in(:id)”, paramMap, -1, -1);
다시 한 번 주의:hql 에서 조건 필드 는 어떤 유형 입 니까?매개 변 수 를 전달 할 때 반드시 주의해 야 합 니 다.만약 에 범 형 이 큰 유형 이 라면 실제 값 을 추가 할 때 반드시 해당 하 는 유형 으로 전환 해 야 합 니 다.
여기까지 입 니 다.이상 은 두 가지 HQL 사고 입 니 다.하지만 저 는 안 드 로 이 드 를 하 는 사람 이기 때문에 회사 에서 자바 백 스테이지 개발 도 없고 저 를 잠시 괴 롭 혔 습 니 다.
그러나 인터넷 에서 해결 방안 을 찾 았 는데 이 매개 변 수 는 Collection<>이 라 고 써 야 한다 고 했 습 니 다.사실은 작은 데이터 형식 도 가능 합 니 다.이 Collection 은 자바 의 큰 인터페이스 로 서 볼 때 가 비교적 적 습 니 다.
검색 예 에서 Spring Data JPA
/**
*
*
* @param customer
* @return
*/
@SuppressWarnings("unchecked")
@RequestMapping(method = RequestMethod.POST, value = "/findAll")
public @ResponseBody
Iterable<Customer> findAll(@RequestBody Customer customer) {
Pageable pageable = new PageRequest(customer.getPageNumber(), customer.getSize(), Sort.Direction.DESC,
"creationTime");
Specification<Customer> specification = new Specification<Customer>() {
@Override
public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
//
String userId = customer.getUserId();
if (!StringUtils.isEmpty(userId)) {
if (userId.contains(",")) { // in
String[] ids = userId.split(",");
CriteriaBuilder.In<Object> in = cb.in(root.get("userId"));
for (int i = 0; i < ids.length; i++) {
in.value(ids[i]);
}
list.add(in);
} else { //
list.add(cb.equal(root.get("userId").as(String.class), userId));
}
}
return cb.and(list.toArray(new Predicate[list.size()]));
}
};
return this.customerRepository.findAll(specification, pageable);
}
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.