Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 使用JPA标准api进行右连接_Java_Jpa_Criteria - Fatal编程技术网

Java 使用JPA标准api进行右连接

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

我正在尝试使用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 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)
。TRY
typedqueryqueryquerytaskentity=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.