JPA Criteria API выбирает отличные в строковом объекте с выражением конструктора - PullRequest
0 голосов
/ 24 марта 2011

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

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), я получаю исключение, потому что значение flaw.text является строкой, помеченной @Lob (большие тексты)

Есть у кого-нибудь идея, как мне решить эту проблему?Мы используем Eclipse Link 2.

1 Ответ

1 голос
/ 24 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...