JPA 2.0 - использование @OrdercColumn с однонаправленными отношениями @ManyToMany с Hibernate 4.0.1 - PullRequest
0 голосов
/ 13 марта 2012

Проблема У меня есть две сущности (столбец и таблица).Столбец имеет список для хранения присоединения к этому столбцу, поэтому мне очень важен порядок таблиц.

Вот определения сущностей.

@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() {
}

У сущности таблицы нетссылка на столбец, поскольку таблица не должна знать, в каком из них используется joinPath.

Создать оператор 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)
)

для 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)
)

ПРОБЛЕМА: Hibernate будет игнорировать @OrderColumn при JPQL

Выберите t.displayName из столбца c присоединиться к c.joinPath t, где c =:col

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 или есть идеи?

Заранее спасибо.

Norman

1 Ответ

0 голосов
/ 13 марта 2012

hibernate использует клиентскую часть order_index для заполнения списка, но не указывает порядок по. Вы можете загрузить объект Column, стремящийся извлечь JoinPath и получить отображаемое имя из коллекции JoinPath.

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

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