Je me débats récemment pour rejoindre 3 tables avec des données de printemps JPA. J'ai 3 entités, série code>, dossier code> et élément code>. Series Code> a plusieurs dossiers code> et dossier code> a plusieurs éléments code> (relations). Je fais quelque chose comme série.join (dossier_.servies) .join (dossier_.items) code> et je me retrouve avec un jeu de jointure. Je veux faire la requête suivante: Select Items from Series,Dossier,Item
Where Series.Id=Dossier.seriesId
and Dossier.id=Item.dossierId
and series.projectId = :param
3 Réponses :
C'est plus une question JPA.
Premièrement, je souligne toujours, vous n'êtes pas accessible aux "tables". Vous devez les voir comme des entités de domaine. Beaucoup d'utilisation abusive de jpa / hibernate / d'autres ormes proviennent de directives "Traduire" de concepts SQL ou de base de données. P>
Retour à votre question, la réponse est simple. D'abord, assurez-vous d'avoir les "relations" dans vos entités de domaine. Stockage IDS n'aide pas à construire un modèle de domaine concret. Par exemple, vous avez quelque chose comme: p> la requête est simple: p> ou, s'il est Plus raisonnable d'avoir seulement le @manytoone code> s et omettez le @onetomany code> s, la requête est toujours simple: p>
[toujours rocheux ici] Peut-être que je ne me suis pas fait de moi-même.Je savoir comment exprimer la requête dans HQL.Le problème est d'utiliser les spécifications de Spring Data, à l'aide de l'API de critères afin de construire cette requête.
//Let's exampine the following piece of code
public class CustomItemSpecs {
public static Specification<Item> createSpecificationFromSearchForm(final SearchForm searchForm) {
return new Specification<Item>() {
@Override
public Predicate toPredicate(Root<Item> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
CriteriaQuery<Item> cq = cb.createQuery(Item.class);
CriteriaQuery<Series> sb = cb.createQuery(Series.class);
Root<Series> series = sb.from(Series.class);
Join<Series,Dossier> join1 = series.join(Series_.dossiers);
Join<Dossier, Item> join2 = join1.join(Dossier_.items);
}
}
}
im en utilisant la projection d'interface de données de ressort. Exemple comme celui-ci
Note fort> Les éléments doivent être une classe d'interface P> Classe de référentiel P> @Repository
public interface ItemRepository extends JpaRepository<Items,Long> {
@Query(nativeQuery = true,value = "Select Items from Series,Dossier,Item Where Series.Id=Dossier.seriesId and Dossier.id=Item.dossierId and series.projectId = :param")
public Items findTransaksisByAccountIdOrderById(@Param("param") Long projectId);
}
J'ai une exigence similaire et un même problème. Qu'est-ce qui a résolu votre problème? pouvez-vous répondre à @Rocky Savidis