2017-11-29 26 views
0

내가, 우리가 사람을 객체를 호출 한 :일부 필드가 NULL 일 수있는 경우 JPA에서 criteriaquery에 대한 술어로 객체를 사용할 수 있습니까?

@Entity 
@Table(name = "PERSON") 
public class Person extends PersistentObject { 

    @Id 
    @Column(name = "NAME") 
    private String name; 

    @Column(name = "AGE") 
    private String age; 

    @Column(name = "NICKNAME") 
    private String nickname; 

    @Column(name = "HAIR_COLOR") 
     private String hairColor; 
. 
. 
. 

내가 술어를 사용하여 CriteriaQuery에 필터로이 개체를 사용하기를 원하지만 입력의 일부 obj가 null 인 경우 (예를 들어, 닉네임) 쿼리가 중단됩니다. 다음은 현재 가지고있는 코드의 예입니다.

public List<Person> getPeople(List<Person> peopleToGet) 
    {  
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<Person> cq = cb.createQuery(Person.class); 
     Root<Person> e = cq.from(Person.class); 

     List<Predicate> predicates = new ArrayList<Predicate>(); 

     for(Person person : peopleToGet) 
     { 
      predicates.add(cb.or(cb.and(
        cb.equal(e.get("name"), person.getName()), 
        cb.equal(e.get("age"), person.getAge()), 
        cb.equal(e.get("nickname"), person.getNickname()), 
        cb.equal(e.get("hairColor"), person.getHairColor()) 
        ))); 
. 
. 
. 

개체 값이 항상 같지 않을 때 개체를 필터로 사용할 수 있습니까?

예시 입력 : { "이름": "밥", "나이": "30"}, { "이름": "윌리엄", "닉네임": "빌"}] 이것으로

예를 들어, 내가 Person 테이블에있는 모든 사람을 얻으려면 다음 사람의 이름은 밥이다 과 나이가 30 거나 사람의 이름은 윌리엄이며,이 예제는 조금 불분명 경우 별명 죄송 빌

입니다, 다른 예제로 번역하기가 쉽도록 코드를 변경했습니다. JPA에 대한 지식은 일반적으로 지난 몇 개월 동안 기본적으로 독학 (Read, Google)되었습니다. 이것에 대한 어떤 도움이라도 대단히 감사 할 것입니다. 감사!!

당신을 말하는 것을에서
+0

여기서 '표현'은 무엇입니까? –

+0

@KalaiselvanA 죄송합니다. 내 잘못입니다. 나는 원래 코드를 모두 바꾸지 않았다. 기밀 유지를 위해 정확한 코드를 변경하고 내 개체를 예제 "Person"개체로 바꿨습니다. 나는 그것을 고쳤다, 고마워! – user2867999

답변

0

는 빈의 관련 속성은 재산 null 아닌 경우 null을 적용 할 수없는 경우 기준이 적용되어야합니다. 이를 위해 당신은 and() (당신이 List<Predicate> predicates와 함께 할 것처럼)에 인수로 제공하는 목록을 만든 다음 배열로 변환 할 수 있습니다

for(Person person : peopleToGet) { 
    List<Predicate> andPredicates = new ArrayList<>(); 

    if(person.getName() != null) andPredicates.add(cb.equal(e.get("name"), person.getName())); 
    if(/* similar code for the other properties */) /* ... */; 

    predicates.add(cb.or(cb.and(andPredicates.toArray(new Predicate[andPredicates.size()])))); 
} 
위의 코드는 가정

Person의하지 모든 속성 null

것을 ! 그들이있을 수도 있다면, 그에 따라이를 경계해야합니다!

+0

오, 알 겠어 .... 고마워! 나는 이것을 시험해보고 질문에 결과를 업데이트 할 것이다. – user2867999

+0

이것은 정확히 내가 찾고 있었던 것이었다. 이것은 내가 DB에서 내 데이터를 얻는 훨씬 더 다양한 방법을 제공하여 다른 것들이 매우 광범위 할 때 어떤면에서 특정적일 수있게 해줍니다. 감사!! – user2867999