我正在用查询Dsl进行查询。
我用它来创建一个布尔表达式
public BooleanBuilder getPredicate(BooleanBuilder pBuilderBusquePerso){
int dias = 30;
QEntity1 qEntity = QEntity1.entity;
pBuilderBusquePerso = pBuilderBusquePerso.and(qEntity.date1 != null
? (SQLExpressions.datediff(DatePart.day, qEntity.date2, qEntity.date1).lt(dias) ) :null );
return pBuilderBusquePerso;
}
在另一个过程中,我调用并执行它作为:
BooleanBuilder pBuilderBusquePerso = new BooleanBuilder();
Predicate filter =getPredicate(pBuilderBusquePerso);
Page<Entity> iLista = myRepository.findAll(getMyPredicate(usr, filter, tipoListado, null, estados), paginacion);
所以 sql 查询结果为:
select table1 ta1
......
exists (
select 1
from
table2 ta2
where
ta1.inv_id=ta2.inv_id
and diff_days(ta1.inv_exp_date, ta2.exp_date)<?
)
给出以下错误:
java.sql.SQLException: ORA-00904:"DIFF_DAYS":无效标识符
因此,ddbb oracle的querysql翻译是错误的。有没有办法将queryDsl转换为oracle函数?我需要什么?
我还尝试使用DATETRUNC
pBuilderBusquePerso = pBuilderBusquePerso.and(qEntity.date1 != null
? (SQLExpressions.datetrunc(DatePart.day, qEntity.date1).castToNum(Integer.class).subtract(SQLExpressions.datetrunc(DatePart.day, qEntity.date2).castToNum(Integer.class))).lt(dias) :null );
exists (
select 1
from
table2 ta2
where
ta1.inv_id=ta2.inv_id
and cast(trunc_day(ta2.exp_date) as number(10,0))-cast(trunc_day(ta1.inv_exp_date) as number(10,0))<?
给出类似的错误:
导致原因:Java . SQL . sqlexception:ORA-00904:“TRUNC _日”:无效标识符
和addDays
pBuilderBusquePerso = pBuilderBusquePerso.and(qEntity.date1 != null
? ((SQLExpressions.addDays(qEntity.date2, dias)).after(qEntity.date1)):null );
exists (
select 1
from
table2 ta2
where
ta1.inv_id=ta2.inv_id
and add_days(ta1.inv_exp_date, ?)>ta1.exp_date
)
给出另一个类似的错误:
原因:Java . SQL . sqlexception:ORA-00904:" ADD _ DAYS ":无效标识符
我试图按照这个测试来构建我的查询 https://searchcode.com/codesearch/view/17765673/
提前感谢。
编辑:这是完整的错误跟踪。
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:231)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:214)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
.....................
......................
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
......................
......................
......................
(And here comes the ORA error)
Caused by: java.sql.SQLException: ORA-00904: "TRUNC_DAY": invalid identifier
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
.....
JPQL不可能,因为缺少日期算术。但是它可以通过将JPASQLQuery与OracleTemplate
一起用于本机查询来完成,参见:http://www.querydsl.com/static/querydsl/latest/reference/html_single/#d0e431
final JPASQLQuery query = new JPASQLQuery(em, OracleTemplates.DEFAULT);
//without jpa use: com.querydsl.sql.oracle.OracleQuery
query.select(
SQLExpressions.datediff(
DatePart.day,
SQLExpressions.datetrunc(DatePart.day, qEntity.date1),
SQLExpressions.datetrunc(DatePart.day, qEntity.date2)))
.from(qEntity);
根据评论,这在Oracle中是不可能的。然而,由于您已经标记了java
:Joda Time非常适合计算两个日期之间的差异。
public int CalculateDifference(DateTime date1, DateTime date2) {
return Days.daysBetween(date1, date2).getDays();
}
SQLExpresations
方法仅在与SQL一起使用时有效,而不是与JPA/JPQL查询一起使用。Querydsl JPA不提供开箱即用的日期编辑,因为JPA不支持它。
问题内容: 我需要获取MySQL上几个日期中包含的天数。 例如: 入住日期是 离开日期 当天差是3 问题答案: 怎么样 DATEDIFF 功能? 引用手册页面: DATEDIFF()返回expr1 – expr2,表示为从一个日期到另一个日期的天数。expr1和expr2是日期或日期和时间表达式。在计算中仅使用值的日期部分 就您而言,您可以使用: 但是请注意,日期应写为,而不是您发布的日期。
返回两个日期之间相差的天数。 计算 Date 对象之间的差异(以天为单位)。 const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); getDaysDiffBetweenDates(new Date('2017-12-13'), ne
问题内容: 如何获得几天内两个时间戳之间的差异?我应该为此使用datetime列吗? 我将专栏切换为日期时间。简单的减法似乎并没有在几天内给我带来结果。 我不认为是几秒钟,因为当我将一天中的秒数除以(86,400)时,我不会得到一个明智的答案: 问题答案: 如果您乐于忽略列中的时间部分,则DATEDIFF()会为您提供以天为单位的时差。
问题内容: 我想得到两个Java Date对象之间的区别。我使用了Joda-Time库。但是问题是我得到的天数差异大于实际的天数差异。 这是我的代码段: 这是我的输出: 在这里,为什么将“ 06/22/2010”设为1月22日?有人遇到类似的问题吗? 帮我朋友..提前感谢.. 问题答案: 月份是MM 在您的情况下: DateFormat formatter = new SimpleDateForm
问题内容: 我有一个代码,可以使用np.busdaycount计算除周末以外的日期差异,但是我需要在我无法获得的小时数内。 除周末外,我的工作时间为小时。喜欢 问题 Inflow_date_time = 2019-08-01 23:22:46 End_date_time = 2019-08-05 17:43:51预期小时数42小时(1 + 24 + 17) Inflow_date_time = 2