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.
Он всегда возвращает список сущности.
Либо создайте метод поиска в 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
пункт.