2014-09-03 62 views
2

我在我的PostgreSQL數據庫的兩個表:加入表在Hibernate中

CREATE TABLE tableOne (id int, name varchar(10), address varchar(20)) 
CREATE TABLE tableTwo (id int, info text, addresses varchar(20)[]) 

現在我想創建一個連接如下:

SELECT * FROM tableOne JOIN tableTwo ON address = ANY(addresses) 

我試圖做到這一點使用Hibernate - 類TableOne :

@Entity 
@Table(name = "tableOne") 
class TableOne { 
     private int id; 
     private TableTwo tableTwo; 
     private String address; 

    @Id 
    @Column(name = "id") 
    public getId() { return id; } 

    @ManyToOne 
    @JoinFormula(value = "address = any(tableTwo.addresses)", 
        referencedColumnName = "addresses") 
    public TableTwo getTableTwo(){ 
     return tableTwo; 
    } 
    // Setters follow here 

} 

但是Hibernate的不斷生成查詢與無感JOIN子句,如:

... JOIN tableTwo ON _this.address = any(tableTwo.addresses) = tableTwo.addresses 

如何告訴Hibernate使用註釋格式化我的連接查詢是否正確?不幸的是,我們的項目必須僅限於Criteria API。

編輯:

在下面的評論ashokhein的建議後,我註釋的方法getTableTwo()只有@ManyToOne - 現在我想在那裏withClause會與createAlias(associationPath,alias,joinType,withClause)方法做加盟使用標準的API,想必請在我的ON條款中加入。

但我不知道該怎麼把associationPathalias參數。

任何提示?

+0

不要在實體類中進行查詢創建。它不應該允許自定義查詢。 – ashokhein 2014-09-04 07:05:58

+0

你的意思是創建一個Native Query嗎? – NumberFour 2014-09-04 07:11:14

+0

您可以使用NamedQuery,HSQL,條件 – ashokhein 2014-09-04 07:12:05

回答

0

了大量的時間尋找正確的答案後,因此一些排列,唯一真正的,工程解決方案對我們來說是創建一個視圖:

CREATE VIEW TableA_view AS SELECT TableOne.*,TableTwo.id FROM TableA JOIN TableTwo ON TableOne.address = ANY(TableTwo.addresses) 

並將其映射到實體TableOne而不是原始表。 這是我們唯一的解決方案,除此之外,當然還有使用命名查詢,因爲我們需要堅持使用Criteria API。

正如@ericbn在評論中提到的,這真是一個ORM變得非常煩人的例子。我永遠不會期望像這樣的自定義連接子句在Hibernate中不可行。

0

要支持PostgreSQL數組,您需要一個custom Hibernate Type。有一個專用的用戶類型將允許您運行本地SQL查詢來利用類型:

String[] values = ... 
Type arrayType = new CustomType(new ArrayUserType()); 
query.setParameter("value", values, arrayType); 

HQL supports ANY/SOME syntax但僅限於子查詢。在你的情況下,你需要一個本地查詢來對數組值使用PostgreSQL特定的ANY子句。

0

您可以嘗試命名查詢。

@NamedQuery(name="JOINQUERY", query="SELECT one FROM tableOne one JOIN tableTwo two ON one.address = :address") 
    @Entity 
    class TableOne{...... 

恢復部分是:

TypedQuery<TableOne> q = em.createNamedQuery("query", TableOne.class); 
q.setParameter("address", "Mumbai"); 
for (TableOne t : q.getResultList()) 
    System.out.println(t.address); 

你可能需要做的查詢