[JAVA] Existe en utilisant la spécification dans Spring Data JPA

Supposons que vous ayez une table avec cette structure.

ER.png

J'utilise la spécification lorsque je souhaite émettre une requête légèrement compliquée à l'aide de Spring Data JPA, mais lorsque l'utilisation existe, un problème est survenu avec la structure d'entité suivante. (Setter / getter omis) À propos, la version de Spring Boot est 1.5.4.RELEASE.

User.java



@Entity
public class User {
    @Id
    private String userId;

    private String name;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Phone> services;
}

Phone.java


@Entity
public class Phone {
    @Id
    private Integer phoneId;

    @ManyToOne
    @JoinColumn(name = "USER_ID")
    private User user;

    private Integer type;

    private String number;
}

En utilisant ces entités, la clause existe pour "obtenir un utilisateur qui possède au moins un téléphone"

public interface UserRepository extends CrudRepository<User, Integer>, JpaSpecificationExecutor<User> {

    static Specification<User> existsPhone() {
        return (root, query, cb) -> {
            Subquery<Integer> subquery = query.subquery(Integer.class);
            Root<Phone> subRoot = subquery.from(Phone.class);
            return cb.exists(subquery.select(cb.literal(1)).where(
                    cb.equal(root, subRoot.get("user").get("userId")));
        };
    }

}

Faire comme

userRepository.findAll(Specifications.where(UserRepository.existsPhone()));

Lorsque j'ai exécuté, une StackOverflowError s'est produite.

Apparemment, il semble qu'il ait été référencé de manière circulaire comme Utilisateur → Téléphone → Utilisateur → Téléphone → .... ..

Donc, si je supprime la référence utilisateur du téléphone comme suit, l'erreur a disparu.

User.java



@Entity
public class User {
    @Id
    private String userId;

    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "userId")
    private List<Phone> services;
}

Phone.java


@Entity
public class Phone {
    @Id
    private Integer phoneId;

    private String userId;

    private Integer type;

    private String number;
}
public interface UserRepository extends CrudRepository<User, Integer>, JpaSpecificationExecutor<User> {

    static Specification<User> existsPhone() {
        return (root, query, cb) -> {
            Subquery<Integer> subquery = query.subquery(Integer.class);
            Root<Phone> subRoot = subquery.from(Phone.class);
            return cb.exists(subquery.select(cb.literal(1)).where(
                    cb.equal(root, subRoot.get("userId")));
        };
    }

}

Je ne fais même pas référence à l'utilisateur depuis le téléphone, est-ce que ça va?

Recommended Posts

Existe en utilisant la spécification dans Spring Data JPA
OU rechercher avec la spécification Spring Data Jpa
[spring] Utilisons Spring Data JPA
Créer la variable de clause where dans Spring Data JPA
[Comment installer Spring Data Jpa]
Sortie du journal Spring Data JPA SQL
Spring Data JPA: écrivez une requête en Pure SQL dans @Query of Repository
[Java] Obtenir des données de la base de données à l’aide du service singleton dans Spring (Boot)
Cache de support nul dans Spring Data Redis
Pour écrire des données de réponse directement dans Spring
Spring Data JPA save select-insert n'est qu'une insertion
Gestion des données à l'aide du volume dans Docker (mémorandum personnel)
Référence mutuelle de l'entité de Spring Data JPA et ses notes
Jackson ne peut pas sérialiser JSON hibernateLazyInitializer dans Spring Data JPA entraîne une erreur
Exemple de code pour le contrôle de la base de données par transaction déclarative avec Spring Boot + Spring Data JPA
Exemple de code pour la recherche à l'aide de QBE (requête par exemple) de Spring Data JPA
Trier par Spring Data JPA (avec tri par clé composée)
Création d'un référentiel commun avec Spring Data JPA
Comment définir plusieurs orm.xml dans Spring4, JPA2.1
Spring Boot + Spring Data JPA À propos des jointures de table multiples
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
Un mémorandum lors de l'essai de Spring Data JPA avec STS
J'ai essayé de démarrer avec Spring Data JPA
Jusqu'à l'utilisation de Spring Data et JPA Part 2
Testez la classe injectée sur le terrain dans le test de démarrage Spring sans utiliser le conteneur Spring
Jusqu'à l'utilisation de Spring Data et JPA Part 1
Inject Logger au printemps
Utilisez Interceptor au printemps
Aperçu de Spring Data JDBC
Microservices dans Spring Cloud
Obtenez des cookies au printemps
piège dynamodb de données de ressort
Essayez d'utiliser Spring JDBC
J'ai essayé le guide d'introduction de Spring Boot [Accès aux données avec JPA]
Authentifiez 3 paramètres ou plus au format JSON à l'aide de Spring Security
Créez une API pour envoyer et recevoir des données Json avec Spring
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
8 choses à insérer dans DB en utilisant Spring Boot et JPA
Comment contrôler les transactions dans Spring Boot sans utiliser @Transactional
[Spring Data JPA] L'ID personnalisé est attribué dans une séquence unique au moment de l'enregistrement.