2013-04-26 41 views
0

它可以構建標準查詢這個SQL:Hibernate Criterai API。 JOIN的

SELECT P.This FROM Position P INNER JOIN PersonOnPosition PP ON PP.Tail = P.This WHERE PP.Tail IS NOT NULL 

我想端口休眠標準自定義SQL方言(定製ECM框架),但我有麻煩與JOIN」。

謝謝。

+0

@JulienLanglois我期待這種問題:)我沒有嘗試任何東西。我構建了Hibernate Criteria API的自定義實現(用於定製ECM框架)。所以我移植了Hibernate Criteria的大部分功能,但是'JOIN'的 – MyTitle 2013-04-26 15:10:01

+0

有問題所以你還沒有構建實體呢?我建議先做那些,然後看看你有多遠。 – david99world 2013-04-26 15:14:07

回答

1

正如@Julien Langlois指出的,這取決於您的實體定義。

假設你這樣定義

@Entity 
class PersonOnPosition { 
    @ManyToOne 
    @JoinColumn(name="Tail") 
    Position position; 
} 

的關係可以用

session.createCriteria(PersonOnPosition.class, "PP") 
    .createAlias("position", "P") 
    .setProjection(Property.forName("P.This")) 
    .add(Property.forName("PP.position").isNotNull()) 
    .list(); 

go如果沒有定義的關係,你可以使用子查詢得到同樣的結果:

DetachedCriteria personOnPositionWithTail = DetachedCriteria.forClass(PersonOnPosition.class, "PP") 
    .setProjection(Property.forName("PP.Tail")) 
    .add(Property.forName("PP.Tail").isNotNull()); 
session.createCriteria(Position.class, "P") 
    .setProjection(Property.forName("P.This")) 
    .add(Property.forName("P.This").in(personOnPositionWithTail)) 
    .list(); 
+0

這可能是一個誤導性的迴應。如果他的實體有適當的關聯定義,他只需要添加標準。查看[標準查詢關聯](http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html#querycriteria- association)。子查詢可能性能較差。 – 2013-04-26 17:18:05

+0

@JulienLanglois是的,你是對的。我的印象是,如果定義了一個關係的話,如何定義查詢是明確的(對提問者) - 但情況可能並非如此。所以我添加了「明顯」的方法。謝謝! – skirsch 2013-04-26 18:47:21