【问题标题】:Specfiy columns which should be considered for distinct calculation指定应考虑进行不同计算的列
【发布时间】:2016-07-09 14:54:38
【问题描述】:

我正在使用javax.persistence.criteria.CriteriaBuilderjavax.persistence.criteria.CriteriaQuery 来选择一些实体。

我现在只想选择应该由某个列指定的唯一实体。

javax.persistence.criteria.CriteriaQuery#distinct 方法只返回唯一实体。

我宁愿需要类似的东西

CriteriaQuery<T> distinct(String... columnNames)

你知道我如何在我的 JPA CriteriaQuery 中烘焙出如此独特的东西吗?

Hibernate. 似乎有可能

【问题讨论】:

    标签: java jpa distinct criteria criteria-api


    【解决方案1】:

    下面的说法没有意义:

    我现在只想选择应该是唯一的实体 由某个列指定。

    如果结果集“完全相同”,则按“不同”过滤。 如果只有某些字段相同,则实体是不一样的。

    您可以通过以下方式在结果集上创建不同的子句:

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery query = builder.createQuery();
    Root<Friend> c = query.from(Friend.class);
    query.multiselect(c.get(Friend_.firstName),c.get(Friend_.lastName)).distinct(true);
    

    然后您将从 Friend 实体中获得唯一的名字和姓氏组合。

    例如...“给我朋友的所有唯一组合,其中朋友的名字和姓氏是唯一的。”但这并不意味着给我独特的朋友。

    【讨论】:

      【解决方案2】:

      distinct 将布尔值作为参数。您可以使用多选来选择多个列,如下例所示:

      CriteriaQuery<Country> q = cb.createQuery();
      Root<Country> c = q.from(Country.class);
      q.multiselect(c.get("currency"), c.get("countryCode")).distinct(true);
      

      【讨论】:

      • 当我添加您的代码时,我收到此错误:Unable to locate appropriate constructor on class。删除您的 sn-p 使其再次工作。为什么我需要使用 multiselect 的不同构造函数?我目前没有。
      • 我想我表达我的愿望并不清楚。因此,我改写了我的问题的标题。
      • 为了让您正确:您想要在未选择的列上有所不同?这是不可能的
      • 没有。我想选择House 的所有实体,这些实体与House#colour 属性不同。我想选择整个House 实体。
      • 尝试按房子添加组
      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多