Panache Query с отдельными возвратами PanacheQuery <Entity>, а не ArrayList <String>

Я пытаюсь получить отчетливый результат одного столбца из моей базы данных с помощью Panache+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

Если я изменю переменную "list" на returnType List<TMdBrandAll> ошибка компиляции исчезла.

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

Когда я теперь проверяю исполняемый код в отладчике, я получаю. Вывод отладчика

Как я могу сказать 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 и стандартным запросом гибернации он работает.

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();

Вы знаете, что в списке будут строки.

Второй вариант не так уж и хорош. Я бы использовал первый вариант.

У меня была та же проблема, но я решил, что это работает, если я использую.project(String.class)иGROUP BYвместо :

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

Кажется, что Панаш сбит с толкуDISTINCTпункт.

Другие вопросы по тегам