2017-10-16 1 views
1

J'ai une Assemblée parlementaire paritaire de données Spring EntitéSpel formaté Interrogation printemps données JPA w/Spring Security

@Entity  
public class User { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private Long id; 

Ce que je veux inclure une propriété mutualFriends qui est le résultat d'une requête contre l'utilisateur d'interrogation principle (au printemps sécurité), en utilisant SpEL et EvaluationContext extension model:

Suivant les exemples Spel je suis venu avec quelque chose comme ceci:

@Formula("select count(friendship) from Friendship friendship where " + 
     "friendship.owner.id = id " + 
     "and friendship.friend in " + 
     "(SELECT f.friend FROM Friendship f where f.owner.id = " + 
     "?#{principle != null ? principal.id : id}) ") 
    private Integer mutualFriends; 

La même entité (User) est utilisé quand j'ai besoin de l'utilisateur d'authentification afin d'avoir une certaine logique pour déterminer si le principle est encore disponible ou je reçois une erreur:

Caused by: org.postgresql.util.PSQLException: No value specified for parameter 2.

?#{principle != null ? principal.id : id} 

Est-ce formaté correctement?

Voici la partie pertinente de la requête en veille prolongée qui est exécutée lorsque je reçois l'exception:

select user0_.id as id1_19_, user0_.created_by as created_2_19_, user0_.created_date as created_3_19_, user0_.last_modified_by as last_mod4_19_, user0_.last_modified_date as last_mod5_19_, user0_.activated as activate6_19_, user0_.activation_key as activati7_19_, user0_.avatar_url as avatar_u8_19_, user0_.banner_url as banner_u9_19_, user0_.description as descrip10_19_, user0_.email as email11_19_, user0_.first_name as first_n12_19_, user0_.lang_key as lang_ke13_19_, user0_.last_name as last_na14_19_, user0_.login as login15_19_, user0_.online as online16_19_, user0_.password_hash as passwor17_19_, user0_.reset_date as reset_d18_19_, user0_.reset_key as reset_k19_19_, user0_.test_data as test_da20_19_, 

select count (user0_.friendship) d'amitié amitié où friendship.friend dans ( SELECT f .friend FROM Amis f 0owner.id = COALESCE (? formula2_ de l'utilisateur user0_ où user0_.login =? Spel/JPA correctement implements remplace id avec user0_.id, mais quelque chose manque encore? En outre, il ne semble pas que la partie select count(user0_.friendship) from Friendship friendship where friendship.friend in (SELECT f.friend FROM Friendship f where f.owner.id = COALESCE(?#{principle != null ? principal.id : user0_.null},user0_.id)) and friendship.owner.id = user0_.id as formula2_ de la requête a été correctement analysée?

Répondre

1

Je pense que le problème peut être que id n'est pas connu dans le contexte SpEL. Remplacer l'expression SpEL par

COALESCE(?#{principle != null ? principal.id : null},id) 

devrait faire l'affaire.

+0

A fait un essai, même résultat –

1

Désolé, complètement raté l'évidence:

@Formula est une chose Hibernate. Il ne sait rien sur SpEL et la blessure évalue de telles expressions.

Ce que vous pouvez faire, et ce que l'exemple que vous avez lié est: créer une méthode dans votre référentiel, ajouter une annotation @Query et utiliser SpEL dans ce répertoire.

+0

Dans de nombreux endroits de l'application, l'entité 'User' est liée à d'autres entités, ne devrais-je pas relancer la méthode' @ Query' pour tirer le? OU puis-je ajouter '@ Query' directement à la classe annotée' @ Entity'? –

+0

Vous pouvez mettre des requêtes nommées sur l'entité (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.named-queries) mais encore une fois c'est un Fonction JPA et ne supportera pas SpEL. –