当前位置: 首页 > 知识库问答 >
问题:

Hibernate标准仅基于日期使用不同的日期值

鲁展
2023-03-14

我正在使用Hibernate标准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

这段代码按预期工作,但我想在唯一日期记录的基础上运行distinct函数,这意味着distinct函数不应该考虑时间值,而应该只考虑日期值。所以out put应该是这样的:

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

知道怎么做吗?

共有1个答案

韦锦程
2023-03-14

我找到了一个解决办法,虽然不是那么干净…

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

public class Proj{

   private Date date;
   private String router;

   // .. getters / setters
}

b)在您的条件API(此处为本机sql)中对日期属性使用“sql投影”。我在MySql上):

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

这就足以获得您要查找的不同值,尽管日期将是字符串格式,如果您想将其转换为日期,那么:

c)向标准API添加ResultTransformer:

.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;  
      }
)

就像我说的,这不是最好的解决办法,但它对我有效。现在,criteria调用返回一个对象,该对象封装了您搜索的结果。

 类似资料:
  • 当更新旧日期到新日期时,我得到 SQL错误:ORA-00932:不一致的数据类型:预期日期获取字符00932。00000-“不一致的数据类型:预期%s得到%s”

  • 问题内容: 在甲骨文我有格式的日期 2011年4月17日19:20:23.707000000 我想检索2011年4月17日的所有订单。 但这给我带来了空洞的结果: 问题答案: 为什么使用)? 您应该使用。 请注意,您也可以使用,,,在日期对象作为比较操作。运算符不适用于这种情况,因为当您要根据列的部分内容匹配结果时很有用。请参阅http://www.sql- tutorial.net/SQL-LI

  • 问题内容: 我正在使用ehcache 2.5.4。 我有一个对象,需要整天进行缓存,并在每天的00:00 am用新值刷新。 当前使用ehcache配置,我只能设置生存时间和空闲时间,但这取决于我创建对象的时间或使用时间。即: 有没有一种方法可以使ehcache根据特定的时间使特定的缓存过期。 问题答案: 我通过扩展Ehcache的类来做到这一点: 其余的操作就像将对象的新实例而不是放入缓存一样简单

  • 我需要我的Java Android应用程序来提取和比较日期,但是要获得正确的日期一团糟。 实际运行时间:2022年1月10日周一22:29 结果: 日期当前时间=星期一 一月 10 22:29:53 GMT 01:00 2022 (正确日期) 日历.get(日历年)=2022.0.10 21:29:53 (错误的月份,错误的小时) 当前时间.getyear()=122.0.1 22:29:53 (

  • 我有一个编辑屏幕,其中在我的开始日期和结束日期是从数据库中预先填充的。该控件是一个UIdatePicker插件。我想根据来自服务器的开始日期限制/禁用以前的日期。此外,当我更改日期时,我希望结束日期从开始日期后的一天开始。由于首先填充值,然后将控件添加到输入字段,因此我无法控制它。 任何帮助都将不胜感激。代码如下:

  • 我想添加日期字段到我的实体类。我在我的DDL脚本(data.sql)中使用了以下日期格式-'yyyy-mm-dd'现在我不知道该为日期导入哪个类。我应该从java.util.*还是从java.sql.*导入日期? 以及我应该为该列添加哪些注释 事先谢谢你