Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 比较JPA标准API中的日期实体_Java_Date_Jpa 2.0_Criteria Api - Fatal编程技术网

Java 比较JPA标准API中的日期实体

Java 比较JPA标准API中的日期实体,java,date,jpa-2.0,criteria-api,Java,Date,Jpa 2.0,Criteria Api,使用JPA2和EclipseLink实现 我正在尝试构建一个动态查询,该查询将为我带来一些在给定日期后保留的记录 CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Event> criteria = builder.createQuery(Event.class); Root<Event> root = criteria.from(Event.class); criteria.select(r

使用JPA2和EclipseLink实现

我正在尝试构建一个动态查询,该查询将为我带来一些在给定日期后保留的记录

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Event> criteria = builder.createQuery(Event.class);
Root<Event> root = criteria.from(Event.class);
criteria.select(root);
criteria.distinct(true);
List<Predicate> predicates = new ArrayList<Predicate>();
//...
if (dateLimit != null){
    ParameterExpression<Date> param = builder.parameter(Date.class, "dateLimit");
    predicates.add(builder.lessThanOrEqualTo(root.get("dateCreated"), param));
}

我可以想象,对于这个问题,我没有采取正确的方法,但我找不到任何可能的解决方案的提示或指针。

问题是,使用基于字符串的API,它无法推断
get
-操作的结果值的类型。例如,在中对此进行了解释

如果你使用

predicates.add(builder.lessThanOrEqualTo(root.<Date>get("dateCreated"), param));
predicates.add(builder.lessThanOrEqualTo(root.get(“dateCreated”),param));
相反,它可以很好地工作,因为它可以从type参数中找出返回类型,并发现它是可比较的。注意,使用参数化方法调用
root.get(…)
(例如,请参阅)


另一个(我认为更好的)解决方案是使用基于元模型的API,而不是基于字符串的API。给出了一个关于规范元模型的简单例子。如果您有更多的时间来投资,这是一篇关于静态元模型的好文章:

您需要使用生成的元模型来访问属性,这是一种非常安全的方法。如果使用字符串引用属性,则只能从调用该方法时使用的显式泛型类型、类型转换或编译器执行的自动类型推断类型:

Path<Date> dateCreatedPath = root.get("dateCreated");
predicates.add(builder.lessThanOrEqualTo(dateCreatedPath, dateLimit));
Path dateCreatedPath=root.get(“dateCreated”);
add(builder.lessThanOrEqualTo(dateCreatedPath,dateLimit));

我得到了一个类似的错误,但是语法是predicates.add(cb.greaterThan(article.get(article_uuu.created),因为))并找到此页。对我来说,原因是我已经将我的项目从Java1.7升级到了1.8,并在这个过程中配置了Maven来编译Java1.8。我只需将Maven编译器改回1.7,同时将项目的其余部分保持在1.8,就可以修复错误。

当我使用谓词时,我也遇到了同样的问题。它适用于除日期类型之外的所有类型。我尝试了所有方法,最简单的方法是:

predicates.add(builder.greaterThanOrEqualTo(root.get(criteria.getKey()), (Date)criteria.getValue()));

我在
标准.getValue()
之前添加了
(日期)
,这有助于将我的值对象识别为日期类型。

NetBeans 8.2仍然使用标准发出警告。我不知道为什么
builder.greaterThanOrEqualsTo(root.get(Some.date),date)
builder.greaterThanOrEqualsTo(root.get(Some.date),date)
@Jin-Kwon:确保导入
javax.persistence.criteria.Predicate
,而不是
java.util.function.Predicate
。这为我解决了:)不是一个坏的导入问题,它是一个bug,一个非常老的bug。若要解决此问题,必须将其声明为变量并将其用作参数:
Path=root.get(…);builder.greaterThan(路径、日期)
predicates.add(builder.greaterThanOrEqualTo(root.get(criteria.getKey()), (Date)criteria.getValue()));