Hibernate 按分离表中的列排序
Hibernate order by column in detached tables
我有 4 个 table。对于这个问题,我将它们命名为 tableA, tableB, tableC, tableD.
tableB 看起来像这样:id, name, label, some_other_parameters
tableC 看起来像这样:id, code, some_other_parameters
tableD 列:
ID,
tableA_id,
tableB_id,
tableC_id,
实体版本
tableD 中的列未在实体中定义一对多、多对一关联。而且无法更改。原因无所谓,但无法更改。
列的定义如下所示:
@Column(名称 - "T_tableA_ID")
私人长 tableAId;
tableB 和 tableC 的列定义看起来相同。
tableD 中的行插入后如下所示:
tableA 不为空,tableB 不为空,tableC 为空
或:
tableA 不为空,tableB 为空,tableC 不为空
我想按顺序从 tableD 获取列表:
tableB 行按标签排序 || ' ' || name asc - (不同行的标签可以相同,名称是唯一的)
接着
tableC 行按代码升序排列
甚至可以在标准中这样做吗?
现在我为 tableD 创建了视图并从视图中列出。当我在 tableD 中更新或插入行时,我使用 table 的实体。所以我有两个实体:视图(有列 display_name,我按此列排序)和 table(用于插入和更新)。但是这个解决方案对我来说并不完美。我更喜欢使用标准。
我需要这样的条件:
select * from
TABLE_D tab_d
where TABLE_A_ID = 1 --example id
order by TABLE_B_ID,
case when TABLE_B_ID is not null then
(select code from TABLE_B where id = tab_d.TABLE_B_ID)
else
(select label || ' ' || name from TABLE_C where id = tab_d.TABLE_C_ID)
end
另一个 sql returns 按照我需要的方式对数据进行排序:
select tab_d.* from
table_d tab_d
left join table_b tab_b on tab_b.id = tab_d.t_groups_id
left join table_c tab_c on tab_c.id = tab_d.t_users_id
where table_a_id = 10485
order by tab_d.t_groups_id, tab_b.code, tab_c.name || ' ' || tab_c.surname
可以为第一个或第二个 sql 语句创建条件吗?
您可以扩展 org.hibernate.criterion.Order 并提供您自己的实现,为订单生成 SQL。参见 the code example
public class OrderBySqlFormula extends Order {
private String sqlFormula;
/**
* Constructor for Order.
* @param sqlFormula an SQL formula that will be appended to the resulting SQL query
*/
protected OrderBySqlFormula(String sqlFormula) {
super(sqlFormula, true);
this.sqlFormula = sqlFormula;
}
public String toString() {
return sqlFormula;
}
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
return sqlFormula;
}
/**
* Custom order
*
* @param sqlFormula an SQL formula that will be appended to the resulting SQL query
* @return Order
*/
public static Order sqlFormula(String sqlFormula) {
return new OrderBySqlFormula(sqlFormula);
}
}
然后只需使用您的订单
criteria.addOrder(OrderBySqlFormula.sqlFormula("(a + b) desc"));
我有 4 个 table。对于这个问题,我将它们命名为 tableA, tableB, tableC, tableD.
tableB 看起来像这样:id, name, label, some_other_parameters
tableC 看起来像这样:id, code, some_other_parameters
tableD 列: ID, tableA_id, tableB_id, tableC_id, 实体版本
tableD 中的列未在实体中定义一对多、多对一关联。而且无法更改。原因无所谓,但无法更改。 列的定义如下所示: @Column(名称 - "T_tableA_ID") 私人长 tableAId;
tableB 和 tableC 的列定义看起来相同。
tableD 中的行插入后如下所示:
tableA 不为空,tableB 不为空,tableC 为空
或:
tableA 不为空,tableB 为空,tableC 不为空
我想按顺序从 tableD 获取列表: tableB 行按标签排序 || ' ' || name asc - (不同行的标签可以相同,名称是唯一的) 接着 tableC 行按代码升序排列
甚至可以在标准中这样做吗?
现在我为 tableD 创建了视图并从视图中列出。当我在 tableD 中更新或插入行时,我使用 table 的实体。所以我有两个实体:视图(有列 display_name,我按此列排序)和 table(用于插入和更新)。但是这个解决方案对我来说并不完美。我更喜欢使用标准。
我需要这样的条件:
select * from
TABLE_D tab_d
where TABLE_A_ID = 1 --example id
order by TABLE_B_ID,
case when TABLE_B_ID is not null then
(select code from TABLE_B where id = tab_d.TABLE_B_ID)
else
(select label || ' ' || name from TABLE_C where id = tab_d.TABLE_C_ID)
end
另一个 sql returns 按照我需要的方式对数据进行排序:
select tab_d.* from
table_d tab_d
left join table_b tab_b on tab_b.id = tab_d.t_groups_id
left join table_c tab_c on tab_c.id = tab_d.t_users_id
where table_a_id = 10485
order by tab_d.t_groups_id, tab_b.code, tab_c.name || ' ' || tab_c.surname
可以为第一个或第二个 sql 语句创建条件吗?
您可以扩展 org.hibernate.criterion.Order 并提供您自己的实现,为订单生成 SQL。参见 the code example
public class OrderBySqlFormula extends Order {
private String sqlFormula;
/**
* Constructor for Order.
* @param sqlFormula an SQL formula that will be appended to the resulting SQL query
*/
protected OrderBySqlFormula(String sqlFormula) {
super(sqlFormula, true);
this.sqlFormula = sqlFormula;
}
public String toString() {
return sqlFormula;
}
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
return sqlFormula;
}
/**
* Custom order
*
* @param sqlFormula an SQL formula that will be appended to the resulting SQL query
* @return Order
*/
public static Order sqlFormula(String sqlFormula) {
return new OrderBySqlFormula(sqlFormula);
}
}
然后只需使用您的订单
criteria.addOrder(OrderBySqlFormula.sqlFormula("(a + b) desc"));