代码之家  ›  专栏  ›  技术社区  ›  Mike Pone

如何在HQL中创建独特的查询

  •  109
  • Mike Pone  · 技术社区  · 16 年前

    是否有方法在HQL中创建Distinct查询。通过使用“distinct”关键字或其他方法。我不确定distinct是否是HQL的有效关键字,但我正在寻找与SQL关键字“distinct”等效的HQL。

    11 回复  |  直到 16 年前
        1
  •  130
  •   Feet    16 年前

    这是我们使用的hql的一个片段。(已更改名称以保护身份)

    String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                    " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
            return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});
    
        2
  •  60
  •   dur    8 年前

    值得注意的是 distinct HQL中的关键字不直接映射到 不同的 SQL中的关键字。

    如果你使用 不同的 HQL中的关键字,那么有时Hibernate会使用 不同的 SQL关键字,但在某些情况下,它会使用结果转换器来产生不同的结果。例如,当您使用这样的外部连接时:

    select distinct o from Order o left join fetch o.lineItems
    

    在这种情况下,不可能在SQL级别过滤掉重复项,因此Hibernate使用 ResultTransformer 过滤重复项 之后 SQL查询已经执行。

        3
  •  16
  •   Tim Büthe    13 年前

    下次做这样的事

     Criteria crit = (Criteria) session.
                      createCriteria(SomeClass.class).
                      setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    
     List claz = crit.list();
    
        4
  •  9
  •   dur    8 年前

    您还可以使用 Criteria.DISTINCT_ROOT_ENTITY 使用Hibernate HQL查询也是如此。

    例子:

    Query query = getSession().createQuery("from java_pojo_name");
    query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return query.list();
    
        5
  •  4
  •   Tadeusz Kopec for Ukraine yespbs    16 年前

    我在将结果转换器与HQL查询结合使用时遇到了一些问题。当我尝试

    final ResultTransformer trans = new DistinctRootEntityResultTransformer();
    qry.setResultTransformer(trans);
    

    它不起作用。我不得不像这样手动转换:

    final List found = trans.transformList(qry.list());
    

    根据API标准,变压器运行良好。

        6
  •  3
  •   dur    8 年前

    我的主查询在模型中看起来像这样:

    @NamedQuery(name = "getAllCentralFinancialAgencyAccountCd", 
        query = "select distinct i from CentralFinancialAgencyAccountCd i")
    

    我仍然没有得到我认为“明显”的结果。它们只是根据桌上的主键组合而不同。

    所以在 DaoImpl 我添加了一行更改,最终得到了我想要的“独特”回报。一个例子是,我现在只看到一次00,而不是看到四次。这是我添加到 DaoImpl :

    @SuppressWarnings("unchecked")
    public List<CacheModelBase> getAllCodes() {
    
        Session session = (Session) entityManager.getDelegate();
        org.hibernate.Query q = session.getNamedQuery("getAllCentralFinancialAgencyAccountCd");
        q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // This is the one line I had to add to make it do a more distinct query.
        List<CacheModelBase> codes;
        codes = q.list();
        return codes;       
    }
    

    我希望这能有所帮助!同样,只有当您遵循实现服务、dao和项目模型类型的编码实践时,这可能才有效。

        7
  •  2
  •   chammu    10 年前

    您可以像这样在条件生成器中添加不同的关键字。

    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<Orders> query = builder.createQuery(Orders.class);
    Root<Orders> root = query.from(Orders.class);
    query.distinct(true).multiselect(root.get("cust_email").as(String.class));
    

    并在模型类中创建字段构造函数。

        8
  •  2
  •   marc_s    6 年前

    假设您有一个映射到Customer_INFO表的客户实体,并且您想获取客户不同名字的列表。您可以使用下面的代码片段来获得相同的结果。

    Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName");
    Object [] firstNamesRows = distinctFirstName.list();
    

    我希望这能有所帮助。所以这里我们使用group-by,而不是使用不同的关键字。

    以前我还发现,当我想将不同的关键字应用于多列时,很难使用它。例如,我想获取不同名字的列表,然后按分组。在这种情况下,我很难使用不同的名字。

        9
  •  1
  •   Amol M Kulkarni    12 年前

    我已经找到了Hibernate查询语言使用Distinct字段的答案。 您可以使用*SELECT DISTINCT(TO_CITY)FROM FLIGHT_OUTE*。 如果你使用 SQL语言 查询,返回字符串列表。您不能按实体类使用它返回值。 所以解决这类问题的答案是使用 HQL语言 具有 SQL语言 .

    FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY);
    

    来自 SQL语言 查询语句它得到DISTINCT ROUTE_ID,并作为List输入。 IN查询过滤与IN(List)不同的TO_CITY。

    返回类型为实体Bean类型。 所以你可以用AJAX来实现,比如 自动完成 .

    愿一切安好

        10
  •  0
  •   Manish Sharma    5 年前

    如果你需要使用 select语句中自定义DTO的关键字和需求 离散元 ,使用new外的new,如下所示-

    select distinct new com.org.AssetDTO(a.id, a.address, a.status) from Asset as a where ...
    
        11
  •  0
  •   Rustem    5 年前

    您可以简单地添加GROUP BY而不是Distinct

    @Query(value = "from someTableEntity where entityCode in :entityCode" +
                " group by entityCode, entityName, entityType")
    List<someTableEntity > findNameByCode(@Param("entityCode") List<String> entityCode);