2016-11-24 1 views
1

Je suis actuellement un peu bloqué avec ceci et je ne peux pas le voir clairement.
Hibernate récupérant l'objet lié à l'utilisateur actuel

J'espère donc que l'un d'entre vous ont une bonne idée de me aider.

Le code important en ce moment:

@Entity 
@Table(name = "T_NOTA_RECIPIENT") 
public class NotaRecipient extends PersistentEntity { 

    @Id 
    @Column(name = "NOTA_RECIPIENT_SID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @Column(name = "STATUS", insertable = true, updatable = true) 
    @Enumerated(EnumType.STRING) 
    private Status status = Status.NEW; 

    @ManyToOne 
    @JoinColumn(name = "NOTA_SID", referencedColumnName = "NOTA_SID", nullable = false) 
    private Nota nota; 

    @ManyToOne 
    @JoinColumn(name = "CREATOR_OFFICE_SID", referencedColumnName = "OFFICE_SID", nullable = false) 
    private Office creator; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "notaRecipient") 
    private Set<FollowUp> followUps; 

    ... 
} 

Maintenant, en fait je ne veux pas charger tous les FollowUp qui sont dans le DB, mais seulement celui de l'utilisateur actuel.
Mais le problème est que je veux inclure le suivi afin que je puisse faire une requête de pagination de base de données.
Nous utilisons hibernate, Spring Data et Query DSL avec BooleanBuilder pour "affiner" notre recherche.

Je pensais utiliser @Formula mais cela doit être une chaîne de caractères constante, donc je ne peux pas inclure userId courant dans cela.

La deuxième solution peut être de définir le suivi comme @Transient et de le récupérer moi-même dans la base de données et de le définir dans le service de mine.
Problème ici est que je ne peux pas l'utiliser comme filtre alors ou en passant commande.

@Formula n'a pas beaucoup de documentation, donc est-il possible de faire un utilisateur @Transient et l'utiliser dans le @Formula?

J'ai demandé quelques collègues, mais ils ne pouvaient pas me aider.

Alors il est le temps de demander ici. Je peux obtenir l'utilisateur actuel dans l'API, donc ce n'est pas un problème.

Quelqu'un at-il des solutions alternatives?

+0

Comment Détectez-vous l'utilisateur actuel? – StanislavL

+0

Je vient le chercher par 'SecurityUtil.getUser()' qui va chercher dans la 'SecurityContextHolder' – chillworld

Répondre

2

Vous pouvez définir un mappage avec l'expression

@JoinColumnOrFormula([email protected](value="(SELECT f.id 
               FROM follow_up_table f 
               WHERE f.nota_id=id 
               and f.user_id={USER_ID})", 
referencedColumnName="...") 

Et puis ajoutez Interceptor mise en veille prolongée (voir the example) et changer le SQL à la volée remplaçant {USER_ID} avec la valeur réelle dans le

/** 
* Called when sql string is being prepared. 
* @param sql sql to be prepared 
* @return original or modified sql 
*/ 
public String onPrepareStatement(String sql); 
+0

Je suis presque là, juste besoin d'obtenir l'intercepteur de travailler avec des données de printemps (et pas de printemps) démarrage – chillworld

+0

http: // forum.spring.io/forum/spring-projects/data/2323-how-to-use-an-hibernate-interceptor-with-spring – StanislavL

+0

Je reviendrai plus tard, cela devrait normalement fonctionner donc je l'ai accepté. Juste notre cadre de base se bat avec moi atm, mais déjà merci – chillworld