具有不同返回值的Panache查询PanacheQuery <Entity>而不是ArrayList <String>

时间:2020-04-21 13:35:14

标签: java hibernate quarkus quarkus-panache

我正在尝试使用Panache + Hibernate从数据库中获得一列的不同结果。通常,在Hibernate中,您将从查询中返回ArrayList<String>

List<String> list = repo
            .find("select DISTINCT(a.country) from TMdBrandAll a order by a.country")
            .page(Page.ofSize(1000)).list();

但是,如果我尝试使用Panache的这种方法,则会收到ErrorMessage Comiler Error Message

如果我将变量“列表”更改为returnType List<TMdBrandAll>,则编译错误消失了。

List<TMdBrandAll> list = brandAllRepo
            .find("select DISTINCT(a.country) from TMdBrandAll a order by a.country")
            .page(Page.ofSize(1000)).list();

当我现在在调试器中检查执行的代码时,我得到了。 Debugger output

如何告诉Panache查询结果将是ArrayList<Strings>而不是ArrayList<PanacheEntity>

感谢您的回答

编辑: 回购代码:

@RequestScoped
@Transactional
public class BrandAllRepo implements PanacheRepositoryBase<TMdBrandAll, Long> {


    public void updateBrand(String brandName, String soundexCode, String countryCode, Long active, Long isNew, String user, Long brandAllId) {

        update("set brandName = ?1, soundexCode = soundex(pkg_util.f_escape_special_char1(?2))," +
                " countryCode = ?3, active = ?4, isNew = ?5, modifiedAt = sysdate, modified_by = ?6 where brandAllId = ?7",
            brandName, soundexCode, countryCode, active, isNew, user, brandAllId);

    }

}

回购中的工作代码:

@Inject
EntityManager em;

public List<String> findCountries() {
    List<String> qres = em
        .createQuery("select DISTINCT(a.countryCode) from TMdBrandAll a order by a.countryCode", String.class)
        .getResultList();

    return new ArrayList<>(qres);
}

通过注入EntityManager和标准的休眠查询,它可以工作。

1 个答案:

答案 0 :(得分:2)

这是Panache的局限性。

看看代码https://github.com/quarkusio/quarkus/blob/master/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java

它总是返回实体的列表。

在BrandAllRepo中创建查找程序方法以返回字符串列表或使用无类型列表:

List list = brandAllRepo
        .find("select DISTINCT(a.country) from TMdBrandAll a order by a.country")
        .page(Page.ofSize(1000)).list();

您知道列表中将包含字符串。

第二个选项不是很好。我会使用第一个选项。