如何在hibernate中使用union执行查询?

时间:2013-08-15 17:03:16

标签: java hibernate hql

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

2 个答案:

答案 0 :(得分: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必须有一个emtpy构造函数和字段访问器。

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

答案 1 :(得分:-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中使用了一种方法来解决这个问题。 我希望我能为所有人做出贡献,祝你好运......