gpt4 book ai didi

java - JPA Criteria API 使用构造函数表达式在字符串 Lob 上选择不同的值

转载 作者:行者123 更新时间:2023-12-01 15:54:09 26 4
gpt4 key购买 nike

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

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,因为值fault.text是一个带有注释的字符串@Lob(大文本)

有人有想法吗,我该如何解决这个问题?我们使用 Eclipse Link 2。

最佳答案

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

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

关于java - JPA Criteria API 使用构造函数表达式在字符串 Lob 上选择不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com