【问题标题】:Hibernate criteria to use distinct date values on the basis of day only休眠标准以仅基于日期使用不同的日期值
【发布时间】:2017-01-11 02:36:53
【问题描述】:

我正在使用 Hibernate Criteria API 并为我的结果使用投影,如下所示:

projList.add(Projections.property("router"), "router");
projList.add(Projections.property("date"), "date");

criteria.setProjection(Projections.distinct(projList));

输出:

2017-01-10 19:47:33.0   Router1
2017-01-11 20:45:59.0   Router1
2017-01-10 21:58:49.0   Router2
2017-01-10 21:59:00.0   Router2

此代码按预期工作,但我想根据唯一的日期记录运行不同的函数,这意味着不同的函数不应该考虑时间值,而应该只考虑日期值。所以输出应该是这样的:

2017-01-10  Router1
2017-01-11  Router1
2017-01-10  Router2

知道怎么做吗?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    我找到了一个解决方案,虽然不是那么干净..

    a) 创建一个 POJO 类,将在其中存储投影结果

    public class Proj{
    
       private Date date;
       private String router;
    
       // .. getters / setters
    }
    

    b) 在您的标准 API 中使用“sqlProjections”作为日期属性(这里是原生 sql .. 我在 MySql 上):

    projList.add(Projections.sqlProjection("DATE_FORMAT(date, '%Y-%m-%d') as date", new String[]{"date"},new Type[] {new StringType()}));
    

    这足以获得您正在寻找的不同值,尽管日期将采用字符串格式,如果您想将其转换为日期:

    c) 将 ResultTransformer 添加到条件 api:

    .setResultTransformer(new ResultTransformer() {
          public Object transformTuple(Object[] tuple, String[] aliases) {
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
             java.util.Date parsed = null;
             try {
                  parsed = format.parse((String) tuple[1]);
             } catch (ParseException e) {}
    
             Proj p = new Proj();
             p.setDate(parsed);
             p.setRouter((String)tuple[0]);
             return p;  
          }
    )
    

    就像我说的,这不是最漂亮的解决方案,但它对我有用。 条件调用现在返回一个对象,该对象封装了您寻求的结果。

    【讨论】:

    • StringType 是抽象的,无法初始化
    【解决方案2】:

    我找到了一种方法:

    代替

    projList.add(Projections.property("date"), "date");
    

    使用

    projList.add(Projections.sqlProjection( "date(date) as date", new String[] {"date"}, new Type[] {StandardBasicTypes.STRING} ));
    

    其中表达式“date(date) as date”第一个“date”是mysql函数,“(date)”是日期的HBM列名,因为“as date”是从mysql返回的列名,输入“date”将是将被填充的 bean 名称。

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2012-09-13
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多