我正在使用CriteriaBuilder和CriteriaQuery来构建对数据库的查询,但是我遇到了一个我不知道如何解决的问题,因为我对这个叫做JPA的折磨非常陌生。
在Java中,对于一个名为Report的类,我有一个名为时间戳的属性,它被设置为相同的@TemporalType。我还有一个名为代销商的类,它有一个Report对象列表。
在我的查询中,我希望获取上一个Affiliate.maxSilenceMinutes.中没有报表的所有从属对象。
我的问题:
的最小值
我知道这可能是一个令人困惑的问题,但主要的部分是:是否可以将表达式转到Expression?如果我尝试使用.as(Long.class)方法,它会为我抛出一个异常,但在大多数DB中哪种应该是默认的底层数据类型呢?
希望你们能帮忙,因为我觉得有点卡住了:)
发布于 2011-03-15 21:35:26
如果您知道在查询时要减去的值,可以预先减去:
Calendar c = new Calendar();
c.setTime(timestamp.getTimestamp());
c.add(DAY, - someNumberOfDays); //or whatever unit you want
Date d = c.getTime();如果不是,您可能需要调用一个数据库函数来执行减法,通过CriteriaBuilder.function()。
CriteriaBuilder.lessThanOrEqual()在可比较的上工作。时间戳是可比的。因此,您可以通过new Timestamp(long ms)构造一个时间戳,并将其与其他表达式进行比较。
我希望这能帮到你。
发布于 2011-04-24 19:53:23
这不是构建在Hibernate中的,所以您需要某种类型的自定义函数。
JDBC标准包括一个函数转义{fn TIMESTAMPADD( SQL_TSI_SECOND, secs, timestamp)},它应该被转换成目标数据库的正确SQL,但并不是所有的JDBC实现都提供它。因此,您可以将自定义StandardJDBCEscapeFunction添加到Hibernate的方言中,以获得所需的结果。
如果您没有这样的实现,那么您必须找出正确的特定于数据库的实现是什么,并且这里有很大的可变性。例如:
甲骨文:(timestamp + secs/86400)
SQLServer:DATEADD(ss,secs,timestamp)
DB2:(timestamp + secs SECONDS)
MySQL:DATE_ADD(timestamp, INTERVAL secs SECONDS)
一旦知道了它,就可以使用正确的表达式作为SQL标准。
日期时间操作在方言中没有标准化,在许多JDBC中也没有完全实现,这意味着您想要做的事情很难以数据库中立的方式编写。
https://stackoverflow.com/questions/4967769
复制相似问题