Таким образом, все решения «попробуйте переписать без исключения» на этой странице имеют небольшую проблему. Либо его не вызывает исключение NonUnique, но также и в некоторых неправильных случаях (см. Ниже).
Я думаю, что правильное решение (возможно) это:
public static <L> L getSingleResultOrNull(TypedQuery<L> query) {
List<L> results = query.getResultList();
L foundEntity = null;
if(!results.isEmpty()) {
foundEntity = results.get(0);
}
if(results.size() > 1) {
for(L result : results) {
if(result != foundEntity) {
throw new NonUniqueResultException();
}
}
}
return foundEntity;
}
Возвращает значение null, если в списке есть элемент 0, возвращает неуникальное, если в списке есть разные элементы, но не возвращает неуникальное, если один из выбранных вами элементов выбран неправильно и возвращает один и тот же объект более одного раза.
Не стесняйтесь комментировать.