【发布时间】:2012-03-29 18:56:47
【问题描述】:
问题 我有两个实体(列和表)。 A Column 有一个 List 用于存储该列的连接路径,因此我需要非常重要的表的顺序。
这里是实体定义。
@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)
)
对于连接表
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 将忽略跟随 JPQL 的 @OrderColumn
Select t.displayName from Column c join c.joinPath t where c = :col
Hibernate 将生成以下 SQL,而没有 order by 语句
/* 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 或者有什么想法?
提前致谢。
诺曼
【问题讨论】:
标签: hibernate many-to-many jpa-2.0