【问题标题】:How to execute query with union in hibernate?如何在休眠中使用联合执行查询?
【发布时间】:2013-08-15 17:03:15
【问题描述】:

Hibernate 不支持 union ,所以我想单独运行 sql。但最后如何组合这些值?

String query ="select
dp.PRODUCTFAMILY,dp.PRODUCTFAMILYDESCR
from TABEL1 dd, TABEL2 DP
where dd.id = 00002
and dd.PRODUCTFAMILY is null
union
select
dp.DIVNUMBER,dp.DIVDESCR
from TABEL1 dd, TABEL2 DP
where dd.id = 00002
and dd.PRODUCT is not null and dd.PRODUCTFAMILY is not null";

public List<PRODUCT> findmethod() {
        return findAllByQuery(query);
   }

请指教如何分别执行两个sql,最后如何组合这些值?

【问题讨论】:

  • 执行第一个查询,执行第二个查询,使用 List.addAll() 将第二个列表的所有元素添加到第一个?

标签: java hibernate hql


【解决方案1】:

请注意,UNION 中的每个 SELECT 语句必须具有相同数量的列。这些列还必须具有相似的数据类型。此外,每个 SELECT 语句中的列的顺序必须相同。

如果是这样,请为您的查询添加别名:

select
dp.PRODUCTFAMILY as PRODUCTFAMILY,dp.PRODUCTFAMILYDESCR as PRODUCTFAMILYDESCR
from TABEL1 dd, TABEL2 DP
where dd.id = 00002
and dd.PRODUCTFAMILY is null
union
select
dp.DIVNUMBER as PRODUCTFAMILY,dp.DIVDESCR as PRODUCTFAMILYDESCR
from TABEL1 dd, TABEL2 DP
where dd.id = 00002
and dd.PRODUCT is not null and dd.PRODUCTFAMILY is not null

您可以通过这种方式使用 SQLQuery 和 AliasToBeanResultTransformer:

session.createSQLQuery(above sql with union).addScalar("PRODUCTFAMILY",StringType.INSTANCE).addScalar("PRODUCTFAMILYDESCR",StringType.INSTANCE).setResultTransformer(new AliasToBeanResultTransformer(PRODUCT.class))

PRODUCT 必须有一个空的构造函数和字段访问器。

否则,如果此联合旨在提取具有不同类型的不同字段,则必须分别运行两个查询,将 addAll() 第二个结果放在第一个!

【讨论】:

  • 我们可以在这里使用'select new'子句吗?直接初始化我的数据bean?
【解决方案2】:

想分享一下,就我而言,我发现了一种绕过这种情况的情况。这里唯一的规则是具有相同的类型,在这种情况下,对应于返回列表的 String 可以添加任意数量的表:

public List<String> findByCPForCNPJ(String query){
TypedQuery<String> ccpf = manager.createQuery("select cpf from PessoaFisica where cpf like :pCpf", String.class);
ccpf.setParameter("pCpf", "%" + query + "%");
List<String> lista1 = ccpf.getResultList();

TypedQuery<String> ccnpj = manager.createQuery("select cnpj from PessoaJuridica where cnpj like :pCnpj", String.class);
ccnpj.setParameter("pCnpj", "%" + query + "%");

lista1.addAll(ccnpj.getResultList());
return lista1;

}

我在 JAVA 中使用了一种方法来解决这个问题。 我希望我贡献了一点,祝大家好运...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多