JPA Criteria API使用Constructor Expression在String Lob上选择distinct

时间:2011-03-24 08:46:01

标签: java jpa

我有一个静态方法可以创建条件查询:

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是一个构造函数表达式类,它包含在multiselect中选择的值。

这一切都适用c.distinct(false),如果我使用c.distinct(true)我得到一个execption,因为值flaw.text是一个带有注释的String @Lob(大文本)

有没有人有想法,我怎么能解决这个问题?我们使用Eclipse Link 2。

1 个答案:

答案 0 :(得分:1)

您的数据库不支持LOB上的不同操作。您需要删除distinct,或从select中删除Lob。不确定为什么你需要一个独特的,你没有做任何连接,所以不应该得到任何重复的行。

如果要获得重复项,可以尝试在子选择中过滤它们,或者在ReportInfo类中定义equals方法,并将结果添加到列表中以删除重复项。