2017-10-15 2 views
1

Ma demande en vertu de Spring Boot v1.5.7Comment filtrer sélection de la table par une autre table par principe d'exclusion

J'ai 3 entités (de façon schématique):

@Entity 
public class Word { 
    @Id 
    @GeneratedValue 
    private Integer id 
    ... 
} 

@Entity 
public class UserWordList { 
    @Id 
    @GeneratedValue 
    private Integer id 

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

    @ManyToOne 
    @JoinColumn(name = "word_id") 
    private Word word; 
} 

@Entity 
public class UserAnotherWordList { 
    @Id 
    @GeneratedValue 
    private Integer id 

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

    @ManyToOne 
    @JoinColumn(name = "word_id") 
    private Word word; 
} 

Et maintenant, je dois sélectionner tous les mots pour l'utilisateur, mais excluent les mots placés dans les listes de l'utilisateur

SQL natif pour user_id = 1 est

select * 
from Word w 
left join UserWordList uwl 
    on w.id = uwl.word_id and uwl.user_id = 1 
left join UserAnotherWordList uawl 
    on w.id = uawl.word_id and uawl.user_id = 1 
where uwl.word_id is NULL 
and uawl.word_id is NULL 

Quelle est la meilleure façon de le faire? Idéalement, je voudrais utiliser les fonctionnalités de données Spring ou HQL, mais je ne comprends pas comment ...

UPD

je résoudre mon problème avec requête native:

@Entity 
@NamedNativeQuery(
    name = "User.getWordsToProcess", 
    resultClass = Word.class, 
    query = "<...native query to select Words...>" 
) 
public class User {...} 

... 

public interface UserRepository extends CrudRepository<User, Integer> { 
    List<Word> getWordsToProcess(Integer userId); 
} 

Répondre

0

plus rapide réponse est Criteria api (mais qui est en veille prolongée 5.2 dépréciée et au-dessus.) , vous pouvez utiliser hQPD:

getSession().createQuery(" select * from UserWordList u left join fetch u.word 
left join fetch u.user").list() 

Et vous pouvez utiliser union ou créer une autre requête pour aller chercher UserAnotherWordList. Vous pouvez également définir des restrictions dans Hql comme ci-dessous:

Query query = getSession().createQuery(" select * from UserWordList u left join fetch u.word left join fetch u.user us where us.user = :sample").list(); 
query.setParameter("sample",value); 
query.list();