我在继承代码中使用JPA中的谓词遇到麻烦

时间:2019-02-06 16:29:28

标签: java hibernate jpa

我有一些继承的代码正在使用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.
}

1 个答案:

答案 0 :(得分:0)

此查询中的问题是您只加入一次chemical。因此,请检查该1 id中的chemical是否等于Integer中的所有List。因此,一旦您List包含多个Integer,结果集就为空。

对于每个要检查的化学编号,您都需要一个单独的联接。

此查询应返回所有Constituent,其中所有Chemicalchemical_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));
}