【问题标题】:Hibernate-Criteria: Select distinct column from table ordered by another columnHibernate-Criteria:从由另一列排序的表中选择不同的列
【发布时间】:2016-01-28 09:36:20
【问题描述】:

我想要实现的目标:使用 Hibernate Criteria 获取由另一列排序的唯一 ID 列表。

到目前为止我的代码:

 Criteria crt = createCriteria(); //complex method returning Criteria
                                  //with joined tables, restrictions and ordering
 crt.setProjection( Projections.distinct( Projections.property( "id")));
 List<Integer> ids = crt.list();

出了什么问题:当我按列设置顺序让我们说“日期”时,我得到查询:

SELECT DISTINCT id FROM table \\JOIN, WHERE...\\ ORDER BY date);

这显然是错误的并导致错误:

ORA-01791: not a SELECTed expression

我的想法如何解决:以某种方式强制 Hibernate 生成此查询:

SELECT DISTINCT id FROM (SELECT * FROM table \\JOIN, WHERE...\\ ORDER BY date);

问题和我尝试过的:createCriteria() 方法,如果不是绝对必要,我不想修改它。我没有找到将这个 Criteria 用作 DetachedCriteria 的方法。

【问题讨论】:

  • 如果有帮助,您可以将分离的条件更改为正常条件。

标签: hibernate hibernate-criteria


【解决方案1】:

您不能将子查询放入带有条件的 FROM 子句中。

你可以解决的问题:

  • 使用 HQL
  • 使用普通 SQL
  • 改为查询

id 不是唯一的吗?那么为什么不把日期放在 select 子句中呢?它会改变结果,除了你在结果中得到另一列。

SELECT distinct date, id
FROM table
ORDER BY date

另一种方法:

SELECT min(date), id
FROM table
GROUP BY id
ORDER BY min(date)

类似这样的:

createCriteria(SomeTable.class)
  .setProjection(Projections.projectionList()
    .add(Projections.groupProperty("id"))
    .add(Projections.min("date"), "minDate")
  .add(Order.desc("minDate"))

【讨论】:

  • 查询太复杂,无法使用 HQL 或纯 SQL。 Id 是唯一的,但我加入表格,一个 Id 可以出现多次。 crt.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY); 没有帮助,因为我也使用了 setFirstResultsetMaxResults,但我收到的数据不足。当我在选择子句中输入“日期”时,我没有收到不同的 id...
  • 我明白了。我有另一个想法。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2015-01-11
  • 2011-04-08
  • 2015-02-26
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多