2012-03-13 144 views
0

問題 我有兩個實體(Column和Table)。一個列有一個列表用於存儲此列的連接路徑,所以我需要非常重要的表的順序。JPA 2.0 - 使用@OrdercColumn與Hibernate 4.0.1的單向@ManyToMany關係

以下是實體定義。

@Entity 
@javax.persistence.Table(name="Column_") 
public class Column extends PersistenceEntity<Column> implements Serializable, Comparable<Column> { 

@ManyToMany 
@JoinTable(name = "column_joinpath", 
joinColumns = { 
    @JoinColumn(name = "column_id", referencedColumnName = "id")}, 
inverseJoinColumns = { 
    @JoinColumn(name = "table_id", referencedColumnName = "id")}) 
@OrderColumn(name="order_index") 
private List<Table> joinPath; 

/** 
* Default constructor 
*/ 
public Column() { 
} 

Table-entity沒有對列的引用,因爲表不應該知道它在哪個joinPath中被使用。

爲JoinTable

create table column_joinpath (
column_id varchar(36) not null, -- with FK 
table_id varchar(36) not null, -- with FK 
order_index integer not null, 
primary key (column_id, table_id, order_index) 
) 

問題創建的SQL語句

爲表

create table Table_ (
    id varchar(36) not null, 
    displayName varchar(255), 
    primary key (id) 
) 

爲列

create table Column_ (
    id varchar(36) not null, 
    primary key (id) 
) 

:Hibernate會忽略在後續的@OrderColumn JPQL

選擇t.displayName從c欄加入c.joinPath t其中C =:山坳

Hibernate會生成以下SQL未經語句

/* Select 
    t.displayName 
from 
    Column c 
join 
    c.joinPath t 
where 
    c = :col */ select 
     table2_.displayName as col_0_0_ 
    from 
     Column_ column0_ 
    inner join 
     column_joinpath joinpath1_ 
      on column0_.id=joinpath1_.column_id 
    inner join 
     Table_ table2_ 
      on joinpath1_.table_id=table2_.id 
    where 
     column0_.id=? 

的解決方法我用的是原生的順序sql查詢

Select t.displayName from Column_ c inner join column_joinpath joinpath on c.id=joinpath.column_id inner join Table_ t on joinpath.table_id=t.id where c.id=:col order by joinpath.order_index 

有沒有人可以如何從SQL轉換到JPQL或有一個想法?

在此先感謝。

諾曼

回答

0

Hibernate使用的order_index客戶端來填充列表,但不指定由訂單。您可以加載提取JoinPath的Column實體,並從JoinPath集合中獲取顯示名稱。

jpql: "from Column c Join fetch c.JoinPath" 

for (Table t : column.getJoinPath()) 
{ 
    // do something with t.getDisplayName(); 
} 
相關問題