Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日食jpql“;where子句;比较时间戳未按预期工作_Java_Db2_Eclipselink_Jpql_Weblogic12c - Fatal编程技术网

Java 日食jpql“;where子句;比较时间戳未按预期工作

Java 日食jpql“;where子句;比较时间戳未按预期工作,java,db2,eclipselink,jpql,weblogic12c,Java,Db2,Eclipselink,Jpql,Weblogic12c,使用时间戳列进行选择的我的jpql“where子句”没有按预期进行“筛选” 它似乎对时间戳的“日期”部分敏感,但忽略了“时间”部分 table1.tmstmp列定义为:“tmstmp时间戳非空” table1实体包含以下命名查询 @NamedQuery(name = "table1.getUpdTime", query = "SELECT e FROM table1 e WHERE e.tmstmp >= :tmstmp order by e.tmstmp asc") tmst

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

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

table1.tmstmp列定义为:“tmstmp时间戳非空”

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); 
它是这样使用的

@Column(name = "TMSTMP", nullable = false)
private Timestamp tmstmp;
TypedQuery<EsEvnt> query = em.createNamedQuery("table1.getUpdTime",
table1.class).setParameter("tmstmp", tmstmp); 
TypedQuery query=em.createNamedQuery(“table1.getUpdTime”,
表1.class).setParameter(“tmstmp”,tmstmp);
例如,当上面的时间戳变量(“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(); 
/…注意,日期是ISO格式的。。。
LocalDateTime ldt=LocalDateTime.parse(tmstmpString,DateTimeFormatter.ISO_DATE_TIME);
Timestamp tmstmp=Timestamp.valueOf(ldt);
- 
-
-
//(请参阅下面编码的“本机查询”)。。。
Query Query=em.createNativeQuery(“从表1e中选择*,其中e.tmstmp>=CAST(?1作为时间戳)”,表1.class)
.设置参数(1,tmstmp);
List resultList=query.getResultList();
谢谢!:)


WebLogic 12.1.3

DB2

爪哇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(); 
Query Query=entityManager.createNativeQuery(“从表1 e中选择*,其中e.tmstmp>=CAST(?1作为时间戳)”,表1.class)
.设置参数(1,tmstmp);
List 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();
CriteriaBuilder-CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=criteriaBuilder.createQuery(Table1.class);
根table1=criteriaQuery.from(table1.class);
表达式=表1.get(“tmstmp”);/。。。注:列名为“tmstmp”。。。
表达式castFunction=criteriaBuilder.function(“TIMESTAMP”,TIMESTAMP.class,Expression);
谓词谓词=criteriaBuilder.greaterThanOrEqualTo(castFunction,tmstmp);
//注意:应该能够添加到谓词。。。
//例如:。,
//谓词=criteriaBuilder.and(谓词,其他谓词);
criteriaQuery.where(谓词);
TypedQuery=entityManager.createQuery(criteriaQuery);
List resultList=query.getResultList();

tmstmp
字段实际上是一个
时间戳
?正如
java.sql.Date
将小时、分钟和秒设置为0。是的,“tmstmp”的类型是:Timestamp。谢谢你的邀请!不,那不行-我也试过了,还有“TemporalType.TIMESTAMP”-但是,没有用。谢谢