【问题标题】:Criteria API: Correct Date Format标准 API:正确的日期格式
【发布时间】:2018-11-13 14:19:29
【问题描述】:

我正在制作一个能够根据某些标准过滤数据的搜索模块。

我已经做了以下:

public class SearchModuleBean implements Serializable{

    @PersistenceContext
    EntityManager entityManager;

    private Date departureDate;
    private Date returnDate;

    public List<Flight> search(){
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Flight> criteriaQuery = cb.createQuery(Flight.class);
        Root<Flight> c = criteriaQuery.from(Flight.class);
        criteriaQuery.select(c).where(getPredicates(cb, c).toArray(new Predicate[0]));
        TypedQuery<Flight> query = entityManager.createQuery(criteriaQuery);
        System.out.println(query.getResultList());
        return query.getResultList();
    }

    private List<Predicate> getPredicates(CriteriaBuilder cb, Root<Flight> c) {
        List<Predicate> predicates = new ArrayList<>();
        predicates.add(cb.equal(c.get(Flight_.departureDate), departureDate));
        return predicates;
    }
}

这里不显示Getters/Setters/Annotations 和imports。

我有一个 JSF 页面,其中填写了出发日期和到达日期。 然后,在 getPredicates 方法中,我检查离开日期是否等于我们数据库中的日期。问题是它们的格式不同,所以他什么也找不到。

【问题讨论】:

  • Criteria 中的日期不是任何“格式”,它是一个 Java 日期对象。如果您有一个条件查询,但第一步有问题,请查看生成的 SQL 以及数据存储中的列类型
  • Billy Frost 是正确的,要检查的一件事是 Java 和数据库中的日期是否真的相等。 java.util.Date 可以包含时间信息,如果您的数据库仅包含日期信息,则它们可能不匹配(11-13-2018 12:00:00 != 11-13-2018 00:00:00)。
  • 这是正确的,我知道,问题是它们确实不匹配,因为时间。即使我的数据库中有日期和时间,我也只能检查日期吗?

标签: java jpa criteria-api


【解决方案1】:

我不倾向于使用 Criteria API,可能还有其他方法,但您可以使用以下之间的运算符:

private List<Predicate> getPredicates(CriteriaBuilder cb, Root<Flight> c, 
           Date departureDate) {

    List<Predicate> predicates = new ArrayList<>();

    //remove time portion from specified date: now dd/mm/yy 00:00
    Date startDate = DateUtils.truncate(departureDate, Calendar.DATE);

    //new date with time initialized to 23:59:59
    Date endDate = DateUtils.addSeconds(DateUtils.addDays(startDate, 1), - 1);

    predicates.add(cb.between(c.get(Flight_.departureDate), startDate, endDate));

    return predicates;
}

DateUtils 是 Commons Lang 中的一个类:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2013-09-18
    相关资源
    最近更新 更多