我有以下课程(实体)
@Entity
public class Magazine {
private int id ;
private String magazine;
//getters and setters
}
// tracking the magazine arrival
@Entity
public class MagazineIn {
private int id;
private java.util.Date inDate;
private java.util.Date magdate;
@OneToOne
private Magazine mag ;
//getters and setters
}
现在我想获得所有杂志的所有到达状态,无论是 杂志有没有
使用条件查询
以下是代码
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);
Root<MagazineIn> magIn = cq.from(MagazineIn.class);
Join<Magazine,MagazineIn> mag = magIn.join("mag" , JoinType.LEFT);
cq.multiselect(mag.get("magazine") , magIn.get("magdate") ,
magIn.get("inDate"));
TypedQuery<Object[]> q = em.createQuery(cq);
但我没有得到所有的杂志列表与indate和magdate null.RIGHT JOIN不受支持。怎么了?
答案 0 :(得分:1)
如果无法更改实体关系,您可以考虑将查询的根目录更改为Magazine并使用与'mag'变量相关的子查询。
答案 1 :(得分:0)
错误的是你确实需要一个正确的联接才能做到这一点。您可以从OneToOne
到Magazine
进行反向MagazineIn
关联,并通过左连接从杂志查询到期刊。
答案 2 :(得分:0)
我已经使用杂志
中的集合解决了这个问题@OneToMany(mappedBy="mag",FETCHTYPE.LAZY)
List<MagazineIn> arrivals