2016-06-30 3 views
1

My jpql "where句"は、タイムスタンプ列を使用して選択すると、期待どおりに "フィルタリング"しません。EclipseLink jpql "where句"比較タイムスタンプが期待通りに機能していません

タイムスタンプの「日付」部分には敏感ですが、「時刻」部分は無視されます。

table1.tmstmp列は次のように定義されますTABLE1エンティティは次の名前付きクエリを含む "TMSTMP TIMESTAMP NOT NULL"

...

@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"の場合、日付部分が2016-06のすべてのレコードが返されます-30。

アイデア?

タイムスタンプ全体を使って明示的に選択する "where句"に依存したいと思います。

ありがとうございます!

UPDATE

私は私のクエリを(ネイティブクエリが必要とされたように見えた)を以下に示し、一貫して動作するように見えるとして、 "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

+0

「tmstmp」フィールドは実際には「タイムスタンプ」ですか? 'java.sql.Date'は時、分、秒を0に設定します。 –

+0

はい、" tmstmp "はタイプです:タイムスタンプ。頼むためのthx! – sairn

答えて

0

、私のために働いていたものです...

...

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

はここに1つの方法だ...

を想定すると、
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(); 
-1

はあなたのためにこの仕事をしていますか?

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

UPDATE:以下

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

それは動作しません。私はそれと "TemporalType.TIMESTAMP"も試していました...しかし、役に立たない。 Thx – sairn

+0

あなたは@Temporalアノテーションを使用することができます。私のアップデート – iAlpaka

+0

もそれを試してみてください。どうも! – sairn

関連する問題