EclipseLink jpql "where clause" 比较时间戳未按预期工作
EclipseLink jpql "where clause" comparing timestamp is not working as expected
我的 jpql "where clause" select 使用时间戳列的 jpql "filter" 没有像预期的那样。
它似乎对时间戳的 "date" 部分敏感,但忽略了 "time" 部分。
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);
例如,当上面的时间戳变量 ("tmstmp") 等于“2016-06-30T09:28:33.247-04:00”时,它 returns 所有记录日期部分是:2016-06-30.
有什么想法吗?
我想依靠 "where clause" 明确地 select 使用整个时间戳。
谢谢!
更新
我使用 "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();
谢谢! :)
网络逻辑 12.1.3
DB2
Java 8
EclipseLink 2.1
这对你有用吗?
query.setParameter("tmstmp", tmstmp, TemporalType.DATE)
更新:
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "TMSTMP", nullable = false)
private Date tmstmp;
下面是对我有用的...
假设...
//...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();
我的 jpql "where clause" select 使用时间戳列的 jpql "filter" 没有像预期的那样。
它似乎对时间戳的 "date" 部分敏感,但忽略了 "time" 部分。
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);
例如,当上面的时间戳变量 ("tmstmp") 等于“2016-06-30T09:28:33.247-04:00”时,它 returns 所有记录日期部分是:2016-06-30.
有什么想法吗?
我想依靠 "where clause" 明确地 select 使用整个时间戳。
谢谢!
更新
我使用 "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();
谢谢! :)
网络逻辑 12.1.3
DB2
Java 8
EclipseLink 2.1
这对你有用吗?
query.setParameter("tmstmp", tmstmp, TemporalType.DATE)
更新:
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "TMSTMP", nullable = false)
private Date tmstmp;
下面是对我有用的...
假设...
//...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();