我有一个创建条件查询的静态方法:
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)
上正常运行,因为值瑕疵.text是带注释的String@Lob
(大文本)有谁知道,我该如何解决这个问题?我们使用Eclipse Link 2。
最佳答案
您的数据库不支持LOB上的不同操作。您需要删除唯一标识符,或从选择中删除Lob。不知道为什么需要一个独立的,您没有进行任何联接,因此不应获取任何重复的行。
如果要获取重复项,则可以尝试在子选择中对其进行过滤,或者在ReportInfo类中定义一个equals方法,然后将结果添加到列表中以删除重复项。
关于java - JPA Criteria API在带有构造函数表达式的字符串Lob上选择不同的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5416683/