2011-03-24 28 views
0

我有一个创建条件查询一个静态方法:JPA标准API选择不同的字符串与吊球构造表达

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)我得到一个execption,因为值flaw.text与 @Lob(大文本)注释的String

有没有人一个想法,我怎么能解决那个问题?我们使用Eclipse链接2.

回答

1

你的数据库不支持对LOB的独特操作。您需要删除不同,或从选择中删除Lob。不知道为什么你需要一个不同的,你是不是做任何连接,所以不应该得到任何重复的行。

如果您收到重复的,你可以尝试对其进行过滤的子选择,或定义equals方法在ReportInfo类和你的结果添加到列表中删除重复项。

+0

不幸的是,我得到重复。你能给我一个提示,我如何用一个子选择过滤? – reen 2011-03-24 21:02:50