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

在 Oracle 11 上使用查询 Dsl 获取两天之间天差的问题

巫马炫明
2023-03-14

我正在用查询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)

.....

共有3个答案

奚修伟
2023-03-14

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);
公孙高轩
2023-03-14

根据评论,这在Oracle中是不可能的。然而,由于您已经标记了java:Joda Time非常适合计算两个日期之间的差异。

public int CalculateDifference(DateTime date1, DateTime date2) {
   return Days.daysBetween(date1, date2).getDays();
}
莘翰采
2023-03-14

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