2017-11-29 18 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に関する知識は、一般的には、過去数ヶ月にわたり、基本的に独学(基本的にはGoogle)されています。これに対する援助は非常に高く評価されます。ありがとう!!

+0

ここでは「表現」とは何ですか? –

+0

@KalaiselvanA申し訳ありませんが、私のせいです。私は元のコードをすべて変更していませんでした。機密性の理由から、私は正確なコードを変更し、私のオブジェクトを "Person"オブジェクトの例に置き換えました。私はそれを固定しました、ありがとう! – user2867999

答えて

0

豆の関連するプロパティがないnullを適用することがされていない場合、プロパティnullある場合は、あなたは基準が適用されるようにしたいと言っているものから。そのために、あなたは(あなたがList<Predicate> predicatesでやるだけのような)のリストを作成し、and()に引数として与えるために配列に変換する必要があります。

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

関連する問題