2017-10-05 6 views
0

Je suis en train de mettre en œuvre cette requête SQL en utilisant des critères JPA api:droit se joindre à l'aide des critères JPA api

SELECT F.* FROM PF right join F on F.FID = PF.FID WHERE PF.PFID is null; 

qui peut aussi être écrit:

SELECT F.* FROM F left join PF on F.FID = PF.FID WHERE PF.FID is null; 

C'est ce que j'ai essayé:

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

Mais ça ne marche pas, je reçois l'erreur suivante dans cette ligne: 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>) 

Comment puis-je résoudre ce problème?

Mise à jour:

Ce sont mes entités:

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

Mise à jour 2:

Il semble que RIGHT JOIN est pas pris en charge par les critères JPA api, donc cela peut être fait en utilisant la deuxième requête. .

+0

TRY 'TypedQuery queryTaskEntity = getEntityManager() CreateQuery ("F à partir de jointure gauche sur PF = F.FID PF.FID OÙ PF.FID est nulle", F.class);' –

+0

@KlevinDelimeta merci, mais je veux que ce soit fait en utilisant les critères api –

+1

S'il vous plaît décrire ce que «ça ne fonctionne pas» signifie réellement. Avez-vous une exception ou une liste de résultats avec des valeurs différentes de ce que vous attendez? –

Répondre

0
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. 
+1

Cela ressemble à l'API Hibernate Criteria. Mais la question posée pour la solution API JPA Criteria. –

+0

Malheureusement je ne peux pas faire cela, puisque j'utilise JPA, comme @OHGODSPIDERS mentionné. –

+0

okie aimad je ne vérifie pas que c'est jpa –