【问题标题】:Using database functions to transform columns in hibernate criteria使用数据库函数转换休眠条件中的列
【发布时间】:2011-10-14 20:13:49
【问题描述】:

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

我想访问 postgres 数据库中日期时间的日期部分并按此分组。我想查询看起来像:

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

这不起作用给我一个“无法解析属性:Date(beginExam)...”异常。看起来这是一件非常简单的事情,我一定错过了一些东西。鉴于我也在动态构建限制(我在示例中省略了它),似乎标准是用于此的休眠组件,但我现在对任何建议持开放态度,而不是绕过整个问题通过建立我自己的小组。

谢谢

【问题讨论】:

    标签: java hibernate criteria


    【解决方案1】:

    你试过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();
    

    【讨论】:

    • @user996088:请注意我对{alias} 片段的编辑,我建议的解决方案是否有效?我有点好奇,因为我实际上并没有执行其中一个查询,我只是在这里写的(所以可能会有错别字)
    【解决方案2】:

    看看Projections.sqlProjection和Porjections.sqlGroupProjection

    【讨论】:

    • 我做到了,彻底。在 eq 和 between 的众多方法中,没有一种方法可以将列的值转换为日期,因此可以对其进行比较或放入 groupProperty。
    • @user996088: beginExam 的数据类型是什么?您可以在 Projections.sqlProjection 中使用 any SQL,所以我不明白为什么您不能将其转换为日期。
    • 我的错。在我的焦虑中,我没有意识到 gkamal 用错误的链接为我指明了正确的方向。
    • 修复了链接 - 带有框架的 java doc 的问题。我在正确的页面上 - 从地址栏复制了错误的链接。
    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多