Java 如何生成具有外键属性的通用CriteriaQuery?
示例实体:Java 如何生成具有外键属性的通用CriteriaQuery?,java,jpa,criteria-api,Java,Jpa,Criteria Api,示例实体: @Entity public class Employee { @Id @Column(name="EMP_ID") private long id; ... @OneToMany(mappedBy="owner") private List<Phone> phones; ... } @Entity public class Phone { @Id private long id; .
@Entity
public class Employee {
@Id
@Column(name="EMP_ID")
private long id;
...
@OneToMany(mappedBy="owner")
private List<Phone> phones;
...
}
@Entity
public class Phone {
@Id
private long id;
...
@ManyToOne
@JoinColumn(name="OWNER_ID")
private Employee owner;
...
}
通过执行
Repository<Phone> repository;
List<Phone> phones = repository.select("owner.id", 1);
它实际上在工作
我如何基于类型
T
创建一个通用的CriteriaQuery,生成指定的语句,而不知道员工的类型?您必须拆分属性
,然后加入员工
。对于一个级别的连接,它可以如下所示:
String[] splitProperty = property.split(".");
Join<Object, Object> owner = root.join(splitProperty[0]);
Path<Object> path = owner.get(splitProperty[1]);
q.where(path.in(value));
...
String[]splitProperty=property.split(“.”);
Join owner=root.Join(splitProperty[0]);
Path=owner.get(splitProperty[1]);
q、 其中(路径in(值));
...
当然,如果您想要更通用的解决方案,您必须迭代拆分的部分并联接其他表。您必须拆分属性,然后联接员工。对于一个级别的连接,它可以如下所示:
String[] splitProperty = property.split(".");
Join<Object, Object> owner = root.join(splitProperty[0]);
Path<Object> path = owner.get(splitProperty[1]);
q.where(path.in(value));
...
String[]splitProperty=property.split(“.”);
Join owner=root.Join(splitProperty[0]);
Path=owner.get(splitProperty[1]);
q、 其中(路径in(值));
...
当然,如果您想要更通用的解决方案,您必须迭代拆分部分并连接其他表。您可以从子实体(Phone
)连接到父实体(Employee
),并向joned实体询问其id
属性
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Child> cq = cb.createQuery(Child.class);
Root<Child> cr = cq.from(Child.class);
Join<Child, Parent> pj = cr.join("parent");
cq.where(cb.equal(pj.get("id"), 1));
List<Child> rl = em.createQuery(cq).getResultList();
System.out.println(rl);
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Child.class);
根cr=cq.from(子类);
Join pj=cr.Join(“父”);
cq.式中(cb.相等(pj.获得(“id”),1));
List rl=em.createQuery(cq.getResultList();
系统输出打印项次(rl);
您可以从子实体(电话
)加入父实体(员工
),并向joned实体询问其id
属性
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Child> cq = cb.createQuery(Child.class);
Root<Child> cr = cq.from(Child.class);
Join<Child, Parent> pj = cr.join("parent");
cq.where(cb.equal(pj.get("id"), 1));
List<Child> rl = em.createQuery(cq).getResultList();
System.out.println(rl);
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Child.class);
根cr=cq.from(子类);
Join pj=cr.Join(“父”);
cq.式中(cb.相等(pj.获得(“id”),1));
List rl=em.createQuery(cq.getResultList();
系统输出打印项次(rl);
非常感谢!我将按照建议在一个循环中实现它,以支持多个连接。非常感谢!我将按照循环中的建议实现这一点,以支持多个联接。感谢您的回答,但在本例中,我需要知道子类的类型,但我的泛型类只知道父类的类型。感谢您的回答,但在本例中,我需要知道子类的类型,但是我的泛型类只知道父类的类型。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Child> cq = cb.createQuery(Child.class);
Root<Child> cr = cq.from(Child.class);
Join<Child, Parent> pj = cr.join("parent");
cq.where(cb.equal(pj.get("id"), 1));
List<Child> rl = em.createQuery(cq).getResultList();
System.out.println(rl);