У меня есть статический метод, который создает запрос критериев:
public static CriteriaQuery<ReportInfo> reportInfoQuery(EntityManager em){
List<Predicate> criteria = new ArrayList<Predicate>();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<ReportInfo> c = cb.createQuery(ReportInfo.class);
Root<Flaw> flaw = c.from(Flaw.class);
c.distinct(true);
c.multiselect(flaw.get("hostinfo").get("name"), flaw.get("severity"),
flaw.get("plugin").get("pluginid"),
flaw.get("port"), flaw.get("pluginName"),
flaw.get("report").get("scan").get("scanDate"),
flaw.get("text"));
criteria.add(cb.equal(flaw.get("plugin").get("pluginid"), 0);
criteria.add(cb.equal(flaw.get("hostinfo").get("name"), "ahostname");
if (reports.size() > 1 && !reports.contains(null)) {
List<Predicate> orCriteria = new ArrayList<Predicate>();
for (String report : reports) {
orCriteria.add(cb.equal(flaw.get("report").get("name"), report));
}
criteria.add(cb.or(orCriteria.toArray(new Predicate[0])));
} else if (reports.size() == 1 && !reports.contains(null)) {
criteria.add(cb.equal(flaw.get("report").get("name"), reports.get(0)));
}
if (criteria.size() == 1) {
c.where(criteria.get(0));
} else if (criteria.size() > 1) {
c.where(cb.and(criteria.toArray(new Predicate[0])));
}
return c;
}
ReportInfo
— это класс выражения конструктора, который содержит значения, выбранные в множественном выборе.
Все это отлично работает с c.distinct(false)
, если я использую c.distinct(true)
, я получаю исключение, потому что значение fault.text представляет собой строку, аннотированную с помощью @Lob
(большие тексты)
Есть ли у кого-нибудь идея, как я могу решить эту проблему? Мы используем Eclipse Link 2.
1 ответ
Ваша база данных не поддерживает отдельную операцию с большим объектом. Вам нужно либо удалить отдельный, либо удалить Lob из выбора. Не уверен, почему вам требуется отдельное, вы не выполняете никаких соединений, поэтому не должны получать повторяющиеся строки.
Если вы получаете дубликаты, вы можете попытаться отфильтровать их в подвыборке или определить метод equals в своем классе ReportInfo и добавить свои результаты в список, чтобы удалить дубликаты.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.