2012-01-29 17 views
1

I持って、次のモデルクラス:私は、以下のSQLと等価である基準クエリを書きたい論理OR基準と基準の間

@Entity 
@Table(name = "title") 
public final class Title extends ModelData<Title> 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer titleID; 

    @Column(name = "title") 
    private String title; 

    @Column(name = "description") 
    private String description; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "title") 
    private Set<Book> books; 
} 

@Entity 
@Table(name = "book") 
public final class Book extends ModelData<Book> 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "bookID") 
    private int bookID; 

    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) 
    @JoinColumn(name = "titleID") 
    private Title title; 

    @Column(name = "edition") 
    private Integer edition; 

    @Column(name = "isbn") 
    private String ISBN; 
} 

Select 
     t.title, b.edition 
    from 
     books b, title t 
    where 
     b.titleID = t.titleID 
    and 
     (b.edition=4 OR t.title LIKE '%Java%); 

私は次のことを試してみました:

Criteria c = session.createCriteria(Book.class); 

Criteria titleCriteria = c.createCriteria("title"); 
titleCriteria.add(Restrictions.like("title", "%Java%"); 

Criterion edition = Restrictions.eq("edition", 4); 

LogicalExpression orExp = Restrictions.or(edition, titleCriteria); //cannot do this 

どのように私は上記を達成していますか?

ありがとうございました。

答えて

1
public class MyDTO { 
    private String dtoTitle; 
    private String dtoEdition; 
    // + setters/getters 
} 


Criteria c = session.createCriteria(Book.class,"b"); 
c.createAlias("title", "t"); 
c.add(
    Restrictions.disjunction() 
    .add(Restrictions.like("t.title", "%Java%")) 
    .add(Restrictions.eq("b.edition", 4)) 
); 
c.setProjection( 
    Projections.projectionList() 
    .add(Projections.property("t.title"), "dtoTitle") 
    .add(Projections.property("b.edition"), "dtoEdition") 
); 
c.setResultTransformer(Transformers.aliasToBean(MyDTO.class)); 
List<MyDTO> result = (List<MyDTO>)c.list(); 

このような何かが正常に動作する必要があります。

多くの基準を使用して、静的インポートを使用することを検討する必要があります。

0

あなたはこれが欲しいと思います。私はそれをテストしていないので、いくつかの小さなエラーがあるかもしれませんが、基本的な考え方は正しいです。以上の2 OR条件については

Criteria c = session.createCriteria(Book.class); 
Criterion titleCriterion = Restrictions.like("title.title", "%Java%"); 
Criterion edition = Restrictions.eq("edition", 4); 
c.add(Restrictions.or(edition, titleCriterion)); 
+0

あなたは、あなたが行ったような関連するエンティティに制限を加えることはできますか?ボブ。私は上記を試しましたが、次の例外があります: 'org.hibernate.QueryException:プロパティを解決できませんでした:title.title:com.maximus.db.model.Book' –

+0

はい、私はこの種の過去のことだったので、なぜそれが動作していないのかわかりません。ちなみに、このクエリにHQLを使用できない理由はありますか?そうするのがより簡単かもしれません。 –

0

それは使用する方が読みやすいです:

c.add(
    Restrictions.disjunction() 
      .add(Restrictions.eq(...)) 
      .add(Restrictions.eq(...)) 
      .add(Restrictions.eq(...)) 
    ) 
1

もう一つのアイデアその後、

通常criterios

は、あなたのクラスにマッピングファイル、または注釈に式フィールドを追加して式フィールドにyoutは基準を変換し、評価

<property name="titlename" type="string" 
formula="(Select title.title from title 
    where title.titleID= titleID)"/> 

Criteria c = session.createCriteria(Book.class) 
Criteria titleCriteria = c.createCriteria("title"); 
titleCriteria.add(Restrictions.like("titlename", "%Java%"); 
Criterion edition = Restrictions.eq("edition", 4); 
LogicalExpression orExp = Restrictions.or(edition, titleCriteria); //CAN< do this!!!