7
votes

Rejoindre 3 tables dans les données JPA de printemps

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


1 commentaires

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


3 Réponses :


8
votes

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.

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: xxx

la requête est simple: xxx

ou, s'il est Plus raisonnable d'avoir seulement le @manytoone s et omettez le @onetomany s, la requête est toujours simple: xxx


0 commentaires

0
votes

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

    }


0 commentaires

0
votes

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

}


0 commentaires