使用数据库函数在hibernate标准中转换列

时间:2011-10-14 20:13:50

标签: java hibernate criteria

尽管使用了3个小时的谷歌搜索和搜索API,我找不到任何关于是否可以在休眠标准查询中使用数据库函数的参考。具体来说:

我想在postgres数据库和组中访问日期时间的日期部分。我想这个查询看起来像是:

session.createCriteria(Exam.class)
  .setProjection(Projections.projectionList()
    .add(Projections.property("DATE(beginExam)").as("beginDate"))
    .add(Projections.groupProperty("beginDate")))
  .list();

这不起作用,给我一个“无法解析属性:Date(beginExam)...”异常。看起来这是一件非常简单的事情,我一定会错过一些东西。鉴于我也在动态构建限制(我在示例中已经将其排除在外),似乎标准是用于此的hibernate组件,但我对这方面的任何建议持开放的态度,而不是整个问题的步骤通过建立我自己的小组。

由于

2 个答案:

答案 0 :(得分:9)

您是否尝试过这样的Projections.sqlProjection

session.createCriteria(Exam.class)
  .setProjection(Projections.projectionList()
  .add(Projections.sqlProjection("date(beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
  .add(Projections.groupProperty("beginDate")))
.list();

或像这样的Projections.sqlGroupProjection

session.createCriteria(Exam.class)
  .setProjection(Projections.sqlGroupProjection("date(beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
.list();

Hibernate在SQL查询中生成表别名,因此您可能需要将{alias}片段添加到SQL片段中以使其工作:

session.createCriteria(Exam.class)
  .setProjection(Projections.projectionList()
  .add(Projections.sqlProjection("date({alias}.beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
  .add(Projections.groupProperty("beginDate")))
.list();

SQLGroupProjection

session.createCriteria(Exam.class)
  .setProjection(Projections.sqlGroupProjection("date({alias}.beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
.list();

答案 1 :(得分:1)

查看Projections.sqlProjection和Projections.sqlGroupProjection