Проблема У меня есть две сущности (столбец и таблица).Столбец имеет список для хранения присоединения к этому столбцу, поэтому мне очень важен порядок таблиц.
Вот определения сущностей.
@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