我有一些继承的代码正在使用JPA,应该返回包含所有列出的化学物质的所有过程的列表-AND操作。但是,列表始终为空。返回具有列出的任何化学药品(OR)的过程的代码似乎还可以。 JDK版本是1.7。休眠5.0.2
我尝试查看Javadocs,有关JPA和休眠的教程等,但是没有一个让我对Predicate类有很好的感觉。
final CriteriaBuilder cb = getCriteriaBuilder();
final CriteriaQuery<Process> cq = cb.createQuery(Process.class);
final Root<Constituent> constituentRoot = cq.from(Constituent.class);
List<Predicate> clist - new ArrayList<Predicate>();
//chemical_id_list is a List of type Integer = List<Integer> passed to method.
//It contains all of the ids of the chemicals of interest.
for (Integer id: chemical_id_list) {
clist.add(cb.equal(constituentRoot.get(Constituent_.chemical), id));
}
//Code in common with the OR operation, which works..
在我看来,这段代码的cb.equal部分是错误的。 Constituent_.chemical是Constituent类的属性,而不是整数,它是“ id”参数的含义。化学对象怎么可能“等于”整数?还是我完全误会了什么?感谢您的宝贵时间。
以下是组成类中的内容:
public class Constituent implements Serializable{
private int constituentId;
private String chemicalNotes;
private String labelText;
private String quantity;
private int sort;
private Chemical chemical;
private Phase phase;
private Role role;
private Step step;
//getters and setters
}
以下是化学课中的内容:
public class Chemical
{
private int chemicalId;
private String boilingPoint;
private String canonicalFormula;
private String meltingPoint;
private String name;
private String notes;
//getters and setters
}
这是Process类中的内容,尽管我没有在此处的代码中显示它的用法:
public class Process
{
private int processId;
private String name;
private String notes;
private List<Step> steps;
//Getters and setters not shown.
}
答案 0 :(得分:0)
此查询中的问题是您只加入一次chemical
。因此,请检查该1 id
中的chemical
是否等于Integer
中的所有List
。因此,一旦您List
包含多个Integer
,结果集就为空。
对于每个要检查的化学编号,您都需要一个单独的联接。
此查询应返回所有Constituent
,其中所有Chemical
由chemical_id_list
标识
final CriteriaBuilder cb = getCriteriaBuilder();
final CriteriaQuery<Process> cq = cb.createQuery(Process.class);
final Root<Constituent> constituentRoot = cq.from(Constituent.class);
List<Predicate> clist - new ArrayList<Predicate>();
//chemical_id_list is a List of type Integer = List<Integer> passed to method.
//It contains all of the ids of the chemicals of interest.
for (Integer id: chemical_id_list) {
Join<Constituent, Chemical> chemical = root.join(Constituent_.chemical);
clist.add(cb.equal(chemical.get(Chemical_.id), id));
}