使用javax.persistence.criteria按照数据属性从结果集中移除重复项

huangapple 未分类评论62阅读模式
英文:

Remove duplicates from result set using javax.persistence.criteria by data prorety

问题

我需要返回最新的数据。日期字段名为 dateModified。由于旧数据并未以任何方式删除,因此存在许多类似的记录,它们只在 dateModified 字段中有所不同。当前查询返回所有记录,而我仅需要在 dateModified 字段中最新的记录。

public List<SomeDto> search(SearchDto criteria) {
    final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    final CriteriaQuery<SomeDto> query = cb.createQuery(SomeDto.class);
    final Root<SomeModel> root = query.from(SomeModel.class);
    query.multiselect(
         root.get(ID),
         root.get(SOME_ENTERNAL_ID),
         root.get(SOME_NAME_ID));
         query.where(createPredicates(cb, query, root, criteria));
    return entityManager.createQuery(query).getResultList();
}
英文:

I need to return the latest data. Date fields are called dateModified. Since the old data is not deleted in any way, there are a lot of similar records, they differ only in the dateModified field. The current query returns all records, and I need only the most recent in the field dateModified.

    public List&lt;SomeDto&gt; search(SearchDto criteria) {
            final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
            final CriteriaQuery&lt;SomeDto&gt; query = cb.createQuery(SomeDto.class);
            final Root&lt;SomeModel&gt; root = query.from(SomeModel.class);
            query.multiselect(
                 root.get(ID),
                 root.get(SOME_ENTERNAL_ID),
                 root.get(SOME_NAME_ID));
                 query.where(createPredicates(cb, query, root, criteria));
    return entityManager.createQuery(query).getResultList();
}

答案1

得分: 0

尝试按降序排列所有结果,并获取第一个结果,类似于这样:

public List<SomeDto> search(SearchDto criteria) {
    final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    final CriteriaQuery<SomeDto> query = cb.createQuery(SomeDto.class);
    final Root<SomeModel> root = query.from(SomeModel.class);
    query.multiselect(
        root.get(ID),
        root.get(SOME_ENTERNAL_ID),
        root.get(SOME_NAME_ID));
    query.where(createPredicates(cb, query, root, criteria))
         .orderBy(cb.desc(root.get("dateModified")));
    return entityManager.createQuery(query)
                        .setFirstResult(0)
                        .setMaxResults(1)
                        .getResultList();
}

该方法将返回一个列表,其中包含一个具有最近dateModified的元素。

英文:

Try to order all the results in descending order and get the first result, something like this:

public List&lt;SomeDto&gt; search(SearchDto criteria) {
            final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
            final CriteriaQuery&lt;SomeDto&gt; query = cb.createQuery(SomeDto.class);
            final Root&lt;SomeModel&gt; root = query.from(SomeModel.class);
            query.multiselect(
                 root.get(ID),
                 root.get(SOME_ENTERNAL_ID),
                 root.get(SOME_NAME_ID));
                 query.where(createPredicates(cb, query, root, criteria))
                      .orderBy(cb.desc(root.get(&quot;dateModified&quot;)));
    return entityManager.createQuery(query)
                        .setFirstResult(0)
                        .setMaxResults(1)
                        .getResultList();
}

The method will return a list with one element which has the most recent dateModified.

huangapple
  • 本文由 发表于 2020年5月5日 01:06:39
  • 转载请务必保留本文链接:https://java.coder-hub.com/61597740.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定