Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何生成具有外键属性的通用CriteriaQuery?_Java_Jpa_Criteria Api - Fatal编程技术网

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);