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. .
TRY 'TypedQuery queryTaskEntity = getEntityManager() CreateQuery ("F à partir de jointure gauche sur PF = F.FID PF.FID OÙ PF.FID est nulle", F.class);' –
@KlevinDelimeta merci, mais je veux que ce soit fait en utilisant les critères api –
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? –