3

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,最后如何组合这些值?

4

2 回答 2

3

请注意,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() 第二个结果放在第一个!

于 2013-08-15T17:13:07.627 回答
-1

想分享一下,就我而言,我发现了一种绕过这种情况的情况。这里唯一的规则是具有相同的类型,在这种情况下,对应于返回列表的 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 中使用了一种方法来解决这个问题。我希望我贡献了一点,祝大家好运...

于 2014-12-19T16:03:46.510 回答