Java 使用JPA标准api进行右连接
我正在尝试使用jpa criteria api实现此sql查询:Java 使用JPA标准api进行右连接,java,jpa,criteria,Java,Jpa,Criteria,我正在尝试使用jpa criteria api实现此sql查询: SELECT F.* FROM PF right join F on F.FID = PF.FID WHERE PF.PFID is null; 也可以写为: SELECT F.* FROM F left join PF on F.FID = PF.FID WHERE PF.FID is null; 这就是我所尝试的: public List<F> listFWithoutP() { final Crite
SELECT F.* FROM PF right join F on F.FID = PF.FID WHERE PF.PFID is null;
也可以写为:
SELECT F.* FROM F left join PF on F.FID = PF.FID WHERE PF.FID is null;
这就是我所尝试的:
public List<F> listFWithoutP() {
final CriteriaBuilder builder = getCriteriaBuilder();
final CriteriaQuery<F> query = builder.createQuery(F.class);
final Root<PF> from = query.from(PF.class);
Join<PF, F> join = from.join(PF_.f, JoinType.RIGHT);
query.select(join.get(PF_.f))
.where(builder.isNull(from.get(PF_.pFId)));
final TypedQuery<F> typedQuery = getEntityManager().createQuery(query);
return typedQuery.getResultList();
}
我怎样才能解决这个问题
更新:
这些是我的实体:
public class F extends AbstractDomain<Long> {
@Id
@Column
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen")
private Long fId;
@Column(nullable = false)
private String lib;
}
public class PF extends AbstractDomain<Long> {
@Id
@Column
private Long pFId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(nullable = false)
private P p;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(nullable = false)
private F f;
}
公共类F扩展了抽象域{
@身份证
@纵队
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“idgen”)
私人长fId;
@列(nullable=false)
私有字符串库;
}
公共类PF扩展了抽象域{
@身份证
@纵队
私人长pFId;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(nullable=false)
私营部门;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(nullable=false)
私人基金;
}
更新2:
jpa criteria api似乎不支持右连接,因此可以使用第二个查询来实现这一点。TRY
TypedQuery queryTaskEntity=getEntityManager().createQuery(“从F.FID上的F左连接PF=PF.FID,其中PF.FID为null”,F.class)
@KlevinDelimeta谢谢,但我希望使用API标准完成此操作。请描述“它不起作用”的实际含义。您是否得到了一个值与预期值不同的异常或结果列表?@OHGODSPIDERS请检查我的编辑不是100%确定,但我认为join.get(PF_uu.f)
没有意义,因为join已经引用了在PF_u.f属性上进行的连接。我认为,如果您想通过从PF.TRY执行的连接来选择F对象,那么应该是select(join)
。TRYtypedqueryqueryquerytaskentity=getEntityManager().createQuery(“从F left join PF on F.FID=PF.FID,其中PF.FID为null”,F.class)
@KlevinDelimeta谢谢,但我希望使用API标准完成此操作。请描述“它不起作用”的实际含义。您是否得到了一个值与预期值不同的异常或结果列表?@OHGODSPIDERS请检查我的编辑不是100%确定,但我认为join.get(PF_uu.f)
没有意义,因为join已经引用了在PF_u.f属性上进行的连接。我认为,如果您想通过从PF中执行的连接来选择F对象,那么应该是select(join)
。但是这个问题要求JPA标准API解决方案。不幸的是,我不能这样做,因为我使用的是JPA,正如@OhGodspeds提到的。这看起来像Hibernate标准API。但是这个问题需要JPA标准API解决方案。不幸的是,我不能这样做,因为我使用的是JPA,正如@OhGodspeds所提到的。
final Session session = entityManager.unwrap(Session.class);
final Criteria criteria = session.createCriteria(PF.class, "pf")
.createAlias("pf.f", "f")
.add(Restrictions.eqProperty("pf.pFId",
"f.fId"))
.add(Restrictions.isNull("pf.pFId"));
Hello Aimad,
please try this criteria query and let me know if that works,this criteria would exactly replicate your SQL query.
final Session session = entityManager.unwrap(Session.class);
final Criteria criteria = session.createCriteria(PF.class, "pf")
.createAlias("pf.f", "f")
.add(Restrictions.eqProperty("pf.pFId",
"f.fId"))
.add(Restrictions.isNull("pf.pFId"));
Hello Aimad,
please try this criteria query and let me know if that works,this criteria would exactly replicate your SQL query.