У меня есть статический метод, который создает запрос критериев:

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.

0
reen 24 Мар 2011 в 11:46

1 ответ

Ваша база данных не поддерживает отдельную операцию с большим объектом. Вам нужно либо удалить отдельный, либо удалить Lob из выбора. Не уверен, почему вам требуется отдельное, вы не выполняете никаких соединений, поэтому не должны получать повторяющиеся строки.

Если вы получаете дубликаты, вы можете попытаться отфильтровать их в подвыборке или определить метод equals в своем классе ReportInfo и добавить свои результаты в список, чтобы удалить дубликаты.

1
James 24 Мар 2011 в 16:17
К сожалению, я получаю дубликаты. Можете ли вы дать мне подсказку, как я могу фильтровать с помощью подзапроса?
 – 
reen
25 Мар 2011 в 00:02