Java持久性标准;演员表<;时间戳>;表达<;长>;?
我正在使用CriteriaBuilder和CriteriaQuery来构建对数据库的查询,但我遇到了一个我不知道如何解决的问题,因为我对整个称为JPA的考验非常陌生 在Java中,对于名为Report的类,我有一个名为timestamp的属性,它被设置为相同的@TemporalType。 我还有一个名为Affiliate的类,它有一个报告对象列表 在我的查询中,我想获取在最后一个Affiliate.maxsinerminutes中没有报告的所有Affiliate对象 我的问题是:Java持久性标准;演员表<;时间戳>;表达<;长>;?,java,generics,jpa,criteria,Java,Generics,Jpa,Criteria,我正在使用CriteriaBuilder和CriteriaQuery来构建对数据库的查询,但我遇到了一个我不知道如何解决的问题,因为我对整个称为JPA的考验非常陌生 在Java中,对于名为Report的类,我有一个名为timestamp的属性,它被设置为相同的@TemporalType。 我还有一个名为Affiliate的类,它有一个报告对象列表 在我的查询中,我想获取在最后一个Affiliate.maxsinerminutes中没有报告的所有Affiliate对象 我的问题是: 在标准化JPA
希望你们能帮忙,因为我觉得有点卡住了:)如果你知道在查询时要减去的值, 您可以事先减去:
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()
适用于可比数据。时间戳是可比较的。因此,您可以通过新时间戳(长ms)
并将其与另一个表达式进行比较
我希望这会有所帮助。这不是Hibernate内置的,因此您需要某种自定义函数 JDBC标准包括一个函数escape
{fn TIMESTAMPADD(SQL_TSI_SECOND,secs,timestamp)}
,该函数应转换为目标数据库的正确SQL,但并非所有JDBC实现都提供该函数。因此,您可以向Hibernate的方言中添加一个定制的StandardJDBCEscapeFunction,以获得所需的结果
如果您没有可用的,那么您必须找出正确的特定于数据库的实现是什么,并且这里有很多变化。例如:
Oracle:(时间戳+秒/86400)
SQLServer:
DATEADD(ss,secs,timestamp)
DB2:
(时间戳+秒)
MySQL:
DATE\u ADD(时间戳,间隔秒)
一旦知道了它,就可以使用正确的表达式作为SQL条件
日期-时间操作在方言中没有标准化,在许多JDBC中也没有完全实现,这意味着您试图做的事情将很难以与数据库无关的方式编写