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

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 findmethod() { return findAllByQuery(query); } 

请告知如何单独执行两个sql,最后如何组合这些值?

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

我想分享一下,在我的情况下,我发现了一种避开这种情况的情况。 这里唯一的规则是具有相同的类型,在这种情况下String,对应于返回列表,可以添加所需数量的表:

 public List findByCPForCNPJ(String query){ TypedQuery ccpf = manager.createQuery("select cpf from PessoaFisica where cpf like :pCpf", String.class); ccpf.setParameter("pCpf", "%" + query + "%"); List lista1 = ccpf.getResultList(); TypedQuery ccnpj = manager.createQuery("select cnpj from PessoaJuridica where cnpj like :pCnpj", String.class); ccnpj.setParameter("pCnpj", "%" + query + "%"); lista1.addAll(ccnpj.getResultList()); return lista1; 

}

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