2012-01-29 20 views
1

我有以下的模型類:邏輯或準則和標準之間的

@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; 
} 

我想寫一個條件查詢等同於以下SQL;

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

我想你想要這個。我沒有測試過,所以可能會有一些小錯誤,但基本的想法是正確的。

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 of:com.maximus.db.model.Book' – 2012-01-29 20:13:09

+0

是的,我已經完成了這種過去的事情,所以我不明白爲什麼它不工作。順便說一下,是否有一個原因,你爲什麼不能使用HQL進行查詢?這樣做可能更直接。 – 2012-01-29 21:20:36

0

超過2種OR條件下,它更具可讀性使用:

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

另一個想法

轉換YOUT標準公式域和評價爲正常criterios

公式字段添加到映射文件,或註釋到類

<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!!!