web-dev-qa-db-fra.com

La requête Spring JPA renvoie Null au lieu de List

J'ai un @Entity Video ayant une relation un-à-plusieurs avec un List<Tag> tags dans l'un de ses champs. J'utilise le @Repository suivant avec Spring Data pour obtenir les tags les plus populaires:

@Repository
public interface TagRepository extends CrudRepository<Tag, Integer>{
    @Query("SELECT t FROM Tag t WHERE (SELECT SUM(v.views) FROM Video v WHERE t MEMBER OF v.tags) > 0")
    public List<Tag> findMostViewedTags(int maxTags);
}

La Query est traitée et considérée comme valide par Spring , j'ai testé leSQLgénéré généré localement et elle a renvoyé 2 Tags . Cependant, dans mon code, je reçois la valeur Null lorsque j'appelle la méthode findMostViewedTags (100).

La stratégie de recherche de requête est la valeur par défaut "CREATE_IF_NOT_FOUND".

  1. Si aucun résultat n'a été trouvé, la méthode doit-elle renvoyer une liste vide ou Null ? Mon comportement souhaité est de recevoir une liste vide.
  2. Pourquoi l'appel de méthode renvoie-t-il Null au lieu d'un List<Tag> avec size () 2?
8
Vjeetje
  1. Le comportement normal renvoie en effet une liste vide si aucun résultat n'est trouvé. Si List<Object> est la valeur de retour de la méthode dans l'interface définie, la méthode ne doit jamais renvoyer Null.
  2. Le problème est qu'un paramètre est donné à la méthode et qu'il n'est utilisé nulle part dans Query . Pour une raison quelconque, Spring décide de renvoyer un Null dans ce cas. Solution: supprimez le paramètre non utilisé ou utilisez-le dans la requête Query .
11
Vjeetje

J'ai connu un problème similaire. La cause était que j'utilisais Mockito et que je ne me suis pas moqué des données avec when().

3
user1747134