Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何在HQL中创建不同的查询_Hibernate_Hql_Distinct - Fatal编程技术网

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

Hibernate 如何在HQL中创建不同的查询,hibernate,hql,distinct,Hibernate,Hql,Distinct,有没有一种方法可以在HQL中创建不同的查询。通过使用“distinct”关键字或其他方法。我不确定distinct是否是HQL的有效密钥,但我正在寻找与SQL关键字“distinct”等价的HQL。(名称已更改以保护身份) String queryString=“选择不同于Foo的f作为b内部连接Foo.bar”+ “其中f.creationDate>=?和f.creationDate

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

String queryString=“选择不同于Foo的f作为b内部连接Foo.bar”+
“其中f.creationDate>=?和f.creationDate<?和b.bar=?”;
返回getHibernateTemplate().find(queryString,新对象[]{startDate,endDate,bar});

值得注意的是,HQL中的
distinct
关键字并没有直接映射到SQL中的
distinct
关键字

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

select distinct o from Order o left join fetch o.lineItems
final List found = trans.transformList(qry.list());

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

final ResultTransformer trans = new DistinctRootEntityResultTransformer();
qry.setResultTransformer(trans);
它不起作用。我必须像这样手动转换:

select distinct o from Order o left join fetch o.lineItems
final List found = trans.transformList(qry.list());

有了标准,API变形金刚工作得很好。

下次做类似的事情

 Criteria crit = (Criteria) session.
                  createCriteria(SomeClass.class).
                  setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

 List claz = crit.list();

我得到了一个答案,Hibernate查询语言可以使用不同的字段。 您可以使用*从航班路线中选择不同的(到城市)*。 如果使用SQL查询,它将返回字符串列表。不能按实体类使用它返回值。 因此,解决这类问题的答案是将HQL与SQL结合使用

从SQL查询语句中,它得到了不同的路由ID,并作为列表输入。 在查询中,从(列表)中筛选不同的TO_CITY

返回类型是实体Bean类型。 因此,您可以在AJAX中使用它,例如自动完成


可能一切正常

您还可以使用
条件。将DISTINCT\u ROOT\u实体
与Hibernate HQL查询一起使用

例如:

Query query = getSession().createQuery("from java_pojo_name");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return query.list();

我的主要查询在模型中如下所示:

@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;       
}
@SuppressWarnings(“未选中”)
公共列表getAllCodes(){
会话=(会话)entityManager.getDelegate();
org.hibernate.Query q=session.getNamedQuery(“getAllCentralFinancialAgencyAccountCd”);
q、 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);//这是我必须添加的一行,以使其执行更独特的查询。
清单代码;
代码=q.list();
返回码;
}

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

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

Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName");
Object [] firstNamesRows = distinctFirstName.list();
我希望有帮助。所以这里我们使用GROUPBY而不是distinct关键字


同样在以前,当我想将distinct关键字应用于多个列时,我发现很难使用distinct关键字。例如,我想得到一个不同名字的列表,lastName然后groupby将简单地工作。在这种情况下,我很难使用distinct。

您可以像这样在标准生成器中输入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));
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(Orders.class);
Root=query.from(Orders.class);
query.distinct(true).multiselect(root.get(“cust_email”).as(String.class));

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

如果需要在select语句中为自定义DTO使用新的关键字,并且需要不同的元素,请使用new-out-of-new,如下所示-

select distinct new com.org.AssetDTO(a.id, a.address, a.status) from Asset as a where ...

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

@Query(value = "from someTableEntity where entityCode in :entityCode" +
            " group by entityCode, entityName, entityType")
List<someTableEntity > findNameByCode(@Param("entityCode") List<String> entityCode);
@Query(value=“来自entityCode所在的someTableEntity:entityCode”+
“按entityCode、entityName、entityType分组”)
List findNameByCode(@Param(“entityCode”)List entityCode);

这里回答:我只在MySQL中使用hibernate-不知道如何处理mssql问题。函数getHibernateTemplate()属于Spring框架,而不是标准API。你知道没有使用Spring框架的等价物吗?达到10k(:这是次优的:它不会在数据库级别丢弃重复,而是将数据从数据库拉到内存中,重复和全部,然后丢弃重复;这取决于数据重复的频率,这会大大增加I/O操作。这是次优的:不会丢弃重复在数据库级别请求时,它只需重复将数据从数据库拉入内存,然后丢弃重复;这取决于数据重复的频率,这会大大增加I/O操作。投影?