web-dev-qa-db-fra.com

Référentiel Spring-Data-Jpa - Souligner le nom de la colonne d'entité

J'utilise spring-data-jpa sur un projet webmvc de printemps. Je rencontre un problème en utilisant création de requête sur un référentiel de l'une de mes entités. Ci-dessous, vous pouvez voir mon entité, mon référentiel et l'exception.

Mon entité:

@Entity
@Table(schema = "mainschema")
@XmlRootElement
public class Municipalperson implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(nullable = false)
    private Integer id;

    @Basic(optional = false)
    @Column(name = "municipal_id", nullable = false)
    private Integer municipal_id;

    @Basic(optional = false)
    @Column(nullable = false, length = 60)
    private String firstname;

    public Municipalperson(Integer id, Integer municipal_id, String firstname) {
        this.id = id;
        this.municipal_id = municipal_id;
        this.firstname = firstname;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getMunicipal_id() {
        return municipal_id;
    }

    public void setMunicipal_id(Integer municipal_id) {
        this.municipal_id = municipal_id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
}

mon référentiel:

@Repository
public interface MunicipalpersonRepository extends JpaRepository<Municipalperson, Integer> {

    List<Municipalperson> findByMunicipal_idOrderByLastnameDesc(int municipal_id);
}

et l'exception,

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'municipalpersonRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property municipal found for type Municipalperson!  

J'ai essayé de définir municipal_id as int, puis Integer et idem pour le paramètre municipal_id sur mon référentiel, mais aucun n'a fonctionné. De plus, j'ai renommé le référentiel en findByMunicipalidOrderByLastnameDesc et findByMunicipalIdOrderByLastnameDesc mais cela n'a pas fonctionné non plus.

Enfin j'ai renommé le municipal_id à municipalId (soulignement supprimé) et également renommé getters/setters et le référentiel (findByMunicipalIdOrderByLastnameDesc) et le problème a été résolu.

Ma question est pourquoi cela se produit-il?

25

Le trait de soulignement _ Est un caractère réservé dans la dérivation de la requête Spring Data (voir documents de référence pour plus de détails) afin de permettre potentiellement la description manuelle du chemin de propriété. Il y a donc deux options:

  1. Tenez-vous aux Java conventions de dénomination de l'utilisation de camel-case pour les noms des variables membres et tout fonctionnera comme prévu.
  2. Échappez au _ En utilisant un trait de soulignement supplémentaire, c'est-à-dire renommez votre méthode de requête en findByMunicipal__idOrderByLastnameDesc(…).

Je recommanderais le premier car vous n'allez pas aliéner les autres Java :).

27
Oliver Drotbohm

J'ai résolu cette erreur en renommant le champ en nom sans soulignement.

@Column(name = "municipal_id", nullable = false)
private Integer municipalId; // <-- field was renamed
32

Veuillez ajouter les propriétés suivantes au fichier application.properties:

spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
2
Jagannath Nanda