web-dev-qa-db-fra.com

Obtenez l'erreur "Requête dérivée invalide" partout dans nos interfaces Spring Data JpaRepository dans STS 3.1

Nous avons implémenté nos référentiels exactement comme indiqué dans la documentation de Spring Data. Tout allait bien jusqu'à ce que nous passions de STS 2.9 à STS 3.1. Toutes les tentatives pour faire disparaître ces erreurs ont échoué et, dans certains cas, elles n’ont même aucun sens! Ils ne correspondent à aucune propriété de l'interface ou des entités utilisées!

Voici un exemple:

public interface CreditNotesRepository extends JpaRepository<CreditNotes, Long> {

    CreditNotes findCurrentCreditNotes(Long shipmentDetailId);
}

La findCurrentCreditNotes est une requête nommée dans notre entité. Ce code s'exécute parfaitement bien.

@NamedQueries({
    @NamedQuery(name = "CreditNotes.getCount", query = "SELECT COUNT(f) FROM CreditNotes f"),
    @NamedQuery(name = "CreditNotes.findCurrentCreditNotes", query =
        "SELECT creditNotes FROM CreditNotes creditNotes"
        + " WHERE creditNotes.shipmentDetail.shipmentDetailId = ?1 "
        + " AND creditNotes.notesSeqNumber =  (SELECT max(creditNotes2.notesSeqNumber) FROM CreditNotes creditNotes2"
        + " WHERE creditNotes.shipmentDetail.shipmentDetailId = creditNotes2.shipmentDetail.shipmentDetailId)")
})

Et l'erreur que nous obtenons:

Invalid derived query! No property find found for type ca.cole.freight.model.CreditNotes

Bien que ce ne soit qu'un drapeau (n'affecte pas la compilation), c'est ennuyeux et déroutant. Quelqu'un peut-il nous éclairer? Et explique-moi comme si j'avais 6 ans! ;)

19
skel625

C'est une erreur IDE expliquée dans le post suivant:

http://forum.springsource.org/showthread.php?138585-Invalid-derived-query!-No-property-delete-found-for-type-Java-lang-Object

En attendant, vous pouvez désactiver la validation dans préférences/source/validateurs de projet/validateur de données} décochez une requête dérivée invalide et STS ne lancera plus le marqueur.

24
Grubhart

Au post du forum de printemps, l’équipe de printemps a annoncé 

Il est déjà corrigé pour STS 3.3.0

Je n'ai pas encore vérifié cette version. Mais j'utilise 3.5.0.RELEASE et le problème revient! Mon correctif est de décocher Requête dérivée non valide

Invalid Derived Query

28
Tuan Dang

Il existe également une solution de contournement pour cela. Ajoutez une annotation @Query à la définition de votre méthode dans votre référentiel sans définition de requête JPQL/SQL. 

Voici un exemple:

@Query
List<OwnerModel> findByFirstNameAndAgeNotZero(@Param(value = "firstName") String firstName);

Dans ce cas, la requête nommée OrderModel.findByFirstNameAndAgeNotZero sera utilisée. Votre erreur Eclipse Invalid derived query devrait également disparaître sans qu'il soit nécessaire de désactiver la validation, comme décrit par @Tuan Dang.

Vérifié sur Eclipse 4.5.1 avec le plug-in Spring installé pour @NamedQuery et @NamedNativeQuery.

11
Paweł Dulęba

Je viens de vivre cela moi-même. Malheureusement, la mise en œuvre de Spring Data a changé entre 1.1 et 1.2. Il ne prend plus en charge la déclaration XML <repository>. Vous pouvez configurer un postfix personnalisé, mais par défaut, il attend un bean de nom de classe <InterfaceName>Impl. S'il ne parvient pas à trouver l'implémentation du référentiel personnalisé, vous commencez à recevoir des erreurs comme celle que vous rencontrez. Il essaie de créer des méthodes pour rechercher des objets en fonction des noms de méthodes de votre interface.

Une alternative consiste à sauvegarder votre version de Spring Data jusqu'à la version 1.1 et à spécifier une localisation de schéma de http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd dans votre code XML.

0
Apropos