我试图使用JPA标准API来实现这个SQL查询:右连接使用JPA标准API
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();
}
但它不工作,我得到以下错误在这行:query.select(join.get(PF_.f))
The method get(SingularAttribute<? super F,Y>) in the type Path<F> is not applicable for the arguments (SingularAttribute<PF,F>)
我该如何解决这个问题?
更新:
这是我的实体:
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;
}
更新2:
好像右连接不是由JPA标准API的支持,所以这可以用做第二个查询。 。
TRY 'TypedQuery queryTaskEntity = getEntityManager()的createQuery( “选自F左连接PF上F.FID = PF.FID WHERE PF.FID为null”,F.class);' –
@KlevinDelimeta谢谢,但我希望这是使用标准api –
完成请描述“它不起作用”实际上是什么意思。你得到一个异常值或一个ResultList的值与你期望值不同吗? –