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

如何在HQL中创建不同的查询

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

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

    9 回复  |  直到 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中的关键字。

    不同的 关键字,则有时Hibernate将使用 不同的

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

    在这种情况下,无法在SQL级别过滤出重复项,因此Hibernate使用 ResultTransformer 之后 已执行SQL查询。

        3
  •  16
  •   Tim Büthe    12 年前

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

    你也可以使用 Criteria.DISTINCT_ROOT_ENTITY

    例子:

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

    我在使用结果转换器和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。下面是我添加到 达伊姆普

    @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;       
    }
    

        7
  •  2
  •   chammu    9 年前

    假设您有一个映射到Customer_信息表的Customer实体,并且希望获得客户的不同名字列表。您可以使用下面的代码片段获得相同的结果。

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

        8
  •  2
  •   marc_s HarisH Sharma    6 年前

    您可以像这样在条件生成器中输入distinct关键字。

    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));
    

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

        9
  •  1
  •   Amol M Kulkarni    11 年前

    您可以使用*从航班路线中选择不同的(到城市)*。 如果你使用 SQL 查询时,返回字符串列表。不能按实体类使用它返回值。 具有 SQL .

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

    SQL 查询语句,它得到不同的路由ID,并作为列表输入。

    返回类型是实体Bean类型。 自动完成 .

        10
  •  0
  •   Manish Sharma    4 年前

    刚出现的 不同元素 ,在“新建”之外使用“新建”,如下所示-

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

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

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