Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring-Data-Jpa Repository - Underscore on Entity Column Name

I am using spring-data-jpa on a spring webmvc project. I am facing an issue using query creation on a Repository of one of my Entities. Below you can see my Entity, my Repository and the Exception.

My Entity:

@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;     } } 

my Repository:

@Repository public interface MunicipalpersonRepository extends JpaRepository<Municipalperson, Integer> {      List<Municipalperson> findByMunicipal_idOrderByLastnameDesc(int municipal_id); } 

and the 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!   

I tried to set municipal_id as int, then as Integer and the same for the parameter municipal_id on my Repository, but none worked. Also, I renamed the Repository to findByMunicipalidOrderByLastnameDesc and findByMunicipalIdOrderByLastnameDesc but it didn't work either.

Finally I renamed the municipal_id to municipalId (underscore removed) and also renamed getters/setters and the Repository (findByMunicipalIdOrderByLastnameDesc) and the issue was resolved.

My question is why this is happening?

like image 985
Georgios Syngouroglou Avatar asked May 04 '14 12:05

Georgios Syngouroglou


2 Answers

I solved this error by renaming field to the name without underscore.

@Column(name = "municipal_id", nullable = false) private Integer municipalId; // <-- field was renamed 
like image 54
Valentyn Kolesnikov Avatar answered Oct 07 '22 08:10

Valentyn Kolesnikov


The underscore _ is a reserved character in Spring Data query derivation (see the reference docs for details) to potentially allow manual property path description. So there are two options you have:

  1. Stick to the Java naming conventions of using camel-case for member variable names and everything will work as expected.
  2. Escape the _ by using an additional underscore, i.e. rename your query method to findByMunicipal__idOrderByLastnameDesc(…).

I'd recommend the former as you're not going to alienate fellow Java developers :).

like image 33
Oliver Drotbohm Avatar answered Oct 07 '22 06:10

Oliver Drotbohm