【问题标题】:EclipseLink jpql "where clause" comparing timestamp is not working as expectedEclipseLink jpql“where 子句”比较时间戳未按预期工作
【发布时间】:2016-11-02 17:37:27
【问题描述】:

我的 jpql “where 子句” 使用时间戳列进行选择没有按预期“过滤”。

它似乎对时间戳的“日期”部分很敏感,但忽略了“时间”部分。

table1.tmstmp 列定义为:“TMSTMP TIMESTAMP NOT NULL”

table1 实体包含以下命名查询...

@NamedQuery(name = "table1.getUpdTime", query = "SELECT e FROM table1 e     
WHERE e.tmstmp >= :tmstmp order by e.tmstmp asc")

tmstmp 属性是这样定义的...

@Column(name = "TMSTMP", nullable = false)
private Timestamp tmstmp;

就是这样用的……

TypedQuery<EsEvnt> query = em.createNamedQuery("table1.getUpdTime",
table1.class).setParameter("tmstmp", tmstmp); 

例如,当上面的 Timestamp 变量(“tmstmp”)等于“2016-06-30T09:28:33.247-04:00”时,它返回日期部分为:2016-06 的所有记录-30。

有什么想法吗?

我想依靠“where 子句”来明确选择使用整个时间戳。

谢谢!

更新

我使用“CAST”函数修改了我的查询(似乎需要原生查询),如下所示,它似乎始终如一地工作......

//...note, date is in ISO format...
LocalDateTime ldt = LocalDateTime.parse(tmstmpString, DateTimeFormatter.ISO_DATE_TIME);
Timestamp tmstmp = Timestamp.valueOf(ldt);
- 
-
-
// (see "native query", coded below)...
Query query = em.createNativeQuery("SELECT * FROM table1 e WHERE e.tmstmp >= CAST(?1 as TIMESTAMP)", Table1.class)  
        .setParameter(1, tmstmp);  
List<Table1> resultList = query.getResultList(); 

谢谢! :)


WebLogic 12.1.3

DB2

Java 8

EclipseLink 2.1

【问题讨论】:

  • tmstmp 字段确实是Timestamp?正如java.sql.Date 将小时、分钟和秒设置为 0。
  • 是的,“tmstmp”是类型:时间戳。谢谢提问!

标签: java db2 eclipselink jpql weblogic12c


【解决方案1】:

下面是对我有用的...

假设...

    //...note, date is in ISO format...
    LocalDateTime ldt = LocalDateTime.parse(tmstmpString, DateTimeFormatter.ISO_DATE_TIME);
    Timestamp tmstmp = Timestamp.valueOf(ldt);

这是一种方法...

    Query query = entityManager.createNativeQuery("SELECT * FROM table1 e WHERE e.tmstmp >= CAST(?1 as TIMESTAMP)", Table1.class)  
            .setParameter(1, tmstmp);  
    List<Table1> resultList = query.getResultList(); 

这是另一种方式...

    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Table1> criteriaQuery = criteriaBuilder.createQuery(Table1.class);
    Root<Table1> table1 = criteriaQuery.from(Table1.class);

    Expression<Byte> expression = table1.get("tmstmp"); // ...NOTE: column name is "tmstmp"...
    Expression<Timestamp> castFunction = criteriaBuilder.function("TIMESTAMP", Timestamp.class, expression);
    Predicate predicate = criteriaBuilder.greaterThanOrEqualTo(castFunction, tmstmp);

    //NOTE: should be able to add to predicate...
    //      e.g.,   
    //          predicate = criteriaBuilder.and(predicate, otherPredicate);

    criteriaQuery.where(predicate);
    TypedQuery<Table1> query = entityManager.createQuery(criteriaQuery);
    List<Table1> resultList = query.getResultList();

【讨论】:

    【解决方案2】:

    这对你有用吗?

    query.setParameter("tmstmp", tmstmp, TemporalType.DATE)
    

    更新:

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "TMSTMP", nullable = false)
    private Date tmstmp;
    

    【讨论】:

    • 不,这不起作用。 -我也试过了,“TemporalType.TIMESTAMP”也试过...... -但是,无济于事。谢谢
    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多