2016-12-03 21 views
4

Java Webアプリケーションでカスタムフィルタを実装しようとしています。 私はこの写真のような何かを達成したい:Criteria API JPA

enter image description here

が、より良いデザインと:))

基本的には私のようなのcriteriasを使用してデータをフィルタリングする必要がありますように、等しくない、等しい 、あります空、空ではない、(より)、より小さい、

私はCriteria APIを使用することにしました。 ので、私は公式ドキュメント読んでいる前に、私は基準のAPIを使用したことがない:

https://docs.oracle.com/cd/E19798-01/821-1841/gjixa/index.html

を、このようなコードがあります:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); 
Metamodel m = em.getMetamodel(); 
EntityType<Pet> Pet_ = m.entity(Pet.class); 
Root<Pet> pet = cq.from(Pet.class); 
cq.where(cb.equal(pet.get(Pet_.name), "Fido") 
.and(cb.equal(pet.get(Pet_.color), "brown"); 

私は自分のコードに変更を加えたし、それがどのように見えますこの:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Client> cq = cb.createQuery(Client.class); 
    Root<Client> client = cq.from(Client.class); 
    cq.where(cb.equal(client.get("firstName"), "Fido").and(cb.like(client.get("lastName"), "brown"))); 
    TypedQuery<Client> q = em.createQuery(cq); 
    List<Client> allClients = q.getResultList(); 

残念ながら.and私のコードとコンパイルには認識されないと、エラーがスローされます。

だから私の質問は以下のとおりです。

  1. 私は自分のコードで何が間違っているフィルタリングデータ
  2. のための右の方法を選択したことがありますか?
  3. あなたのコードで

おかげ

答えて

3

、あなたは以下に示すようにCriteriaBuilderandを使用する必要はなく、存在しないPredicateオブジェクトからandメソッドを使用しようとしている。

 CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<Client> cq = cb.createQuery(Client.class); 
     Root<Client> client = cq.from(Client.class); 

     //Pass all conditions to CriteriaBuilder 'and' 
     Predicate predicate = cb.and(cb.equal(client.get("firstName"), "Fido"), 
        cb.like(client.get("lastName"), "brown")); 
     cq.where(predicate); 

     TypedQuery<Client> q = em.createQuery(cq); 
     List<Client> allClients = q.getResultList(); 

CriteriaBuilderhereの他の方法を参照することができます。

+0

どのようにそのような結果を得ることができますか?私はページネーションを作成できるようにしたいので、クエリ結果の合計数を取得し、最初の15レコードだけを取得する必要があります。 – Irakli

+0

これは本当に良いチュートリアルです。http://www.baeldung.com/jpa-pagination – jklee

関連する問題