web-dev-qa-db-fra.com

Comment créer une requête findBy du référentiel Spring JPA en utilisant une propriété qui contient un mot-clé?

Voici un exemple simplifié de mon problème. J'ai ce référentiel et cette classe d'entité.

public interface ThingRepository extends JpaRepository<ThingEntity, Long> {
    ThingEntity findByFooInAndBar(String fooIn, String bar);
}

@Entity
public class ThingEntity {
    @Column(name="FOO_IN", nullable=false, length=1)
    private String fooIn;

    public String getFooIn() {
        return fooIn;
    }

    public setFooIn(String fooIn) {
        this.fooIn = fooIn;
    }

    /* not including bar property for brevity's sake */
}

Le printemps lève l'exception suivante.

org.springframework.data.mapping.PropertyReferenceException: No property foo found for type ThingEntity!

Il semble que Spring utilise la méthode findByFooInAndBar et pense que foo est le nom de ma propriété et in est un mot clé pour faire correspondre les valeurs dans une collection.

Comment puis-je comprendre que le nom de la propriété est fooIn, pas foo?

18
Ben M.

Pour surmonter ce problème, j'ai défini la requête manuellement à l'aide de @Query annotation. J'accepterai volontiers la réponse de quelqu'un d'autre s'il trouve une solution qui ne nécessite pas de requête manuelle.

public interface ThingRepository extends JpaRepository<ThingEntity, Long> {

    @Query("SELECT t FROM Thing t WHERE t.fooIn = ?1 AND t.bar = ?2")
    ThingEntity findByFooInAndBar(String fooIn, String bar);
}
14
Ben M.

Spring analyse "In" dans votre méthode pour créer la requête vérifiez le lien pour créer votre requête, vous devez changer le nom de la variable fooIn en fooin ou quelque chose comme ça ....

J'ai bien voulu observer le code et j'ai remarqué que votre retour n'est pas un list mais un object.
Remplacez cette partie par List<ThingEntity>.

1
Rog Tebs