Spring webmvcプロジェクトでspring-data-jpaを使用しています。私のエンティティの1つのリポジトリで query creation を使用する問題に直面しています。以下に、エンティティ、リポジトリ、および例外を示します。
私のエンティティ:
@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;
}
}
私のリポジトリ:
@Repository
public interface MunicipalpersonRepository extends JpaRepository<Municipalperson, Integer> {
List<Municipalperson> findByMunicipal_idOrderByLastnameDesc(int municipal_id);
}
と例外、
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!
municipal_id
をintとして、次にInteger
として、リポジトリのパラメータmunicipal_id
と同じように設定しようとしましたが、どれも機能しませんでした。また、リポジトリの名前をfindByMunicipalidOrderByLastnameDesc
およびfindByMunicipalIdOrderByLastnameDesc
に変更しましたが、どちらも機能しませんでした。
最後に、私はnamedmunicipal_id
をmunicipalId
(アンダースコアを削除)に変更し、ゲッター/セッターとリポジトリ(findByMunicipalIdOrderByLastnameDesc
)および問題が解決されました。
私の質問は、なぜこれが起こっているのですか?
アンダースコア__
_は、手動によるプロパティパスの説明を許可するために、Spring Dataクエリ派生(詳細は リファレンスドキュメント を参照)の予約文字です。したがって、2つのオプションがあります。
_
_をエスケープします。つまり、クエリメソッドの名前をfindByMunicipal__idOrderByLastnameDesc(…)
に変更します。仲間を遠ざけるつもりはないので、前者をお勧めしますJava開発者:)。
このエラーは、フィールド名をアンダースコアなしの名前に変更することで解決しました。
@Column(name = "municipal_id", nullable = false)
private Integer municipalId; // <-- field was renamed
以下のプロパティをapplication.propertiesファイルに追加してください:
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy