web-dev-qa-db-ja.com

Spring-Data-Jpaリポジトリ-エンティティ列名の下線

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_idmunicipalId(アンダースコアを削除)に変更し、ゲッター/セッターとリポジトリ(findByMunicipalIdOrderByLastnameDesc)および問題が解決されました

私の質問は、なぜこれが起こっているのですか?

25

アンダースコア___は、手動によるプロパティパスの説明を許可するために、Spring Dataクエリ派生(詳細は リファレンスドキュメント を参照)の予約文字です。したがって、2つのオプションがあります。

  1. メンバー変数名にJava camel-case を使用する命名規則)を守れば、すべてが期待どおりに機能します。
  2. 追加の下線を使用して___をエスケープします。つまり、クエリメソッドの名前をfindByMunicipal__idOrderByLastnameDesc(…)に変更します。

仲間を遠ざけるつもりはないので、前者をお勧めしますJava開発者:)。

27
Oliver Drotbohm

このエラーは、フィールド名をアンダースコアなしの名前に変更することで解決しました。

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

以下のプロパティをapplication.propertiesファイルに追加してください:

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