2016-04-25 10 views
0

私は、フィールド名の前にアンダースコア接頭辞を使用し、そうでない場合はラクダを使用するエンティティの束を持っています。私は、春・データをするために今、私はこのプロジェクトを移行していますことをspring-dataリポジトリのメソッド名をカスタマイズする方法は?

Customer: _id, _firstName, _lastName, _foo__id 

@Entity 
public class Customer { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long _id; 


    private String _firstName; 
    private String _lastName; 

    @OneToOne 
    private Foo _foo; 

    // … methods omitted 
} 

リポジトリ

public interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> { 

    Iterable<Customer> findByFoo(Foo foo); 
} 

テーブル内の対応するフィールドも、この命名規則を使用します多くのIllegalArgumentExceptionsを取得する:

Could not create query metamodel for method 
public abstract java.lang.Iterable 

com.example.repository.CustomerRepository.findByFoo(com.example.model.Foo)! 

Unable to locate Attribute with the given name [foo] on this ManagedType [com.example.model.Customer] 

私はhibernateの命名方針を変更する必要はありませんしかし、どのようにしてクエリメソッド生成命名アルゴリズムを変更して、エンティティ上で "findByFoo" - > "_foo"をマップするか、JPQL用語で "where x._foo__id =? 1 "

私は古い学校のXML設定を使用していますが、春の起動はありません。


編集:役に立たないこのin the docs ..

「我々は強く に助言予約文字としてアンダー扱うように、標準のJava命名規則に従ってくださいを発見した(すなわちありません代わりに のプロパティ名にアンダースコアを使用しますが、代わりにラクダの場合)。

フィールド名をリファクタリングしてアンダースコアを削除し、アンダースコアを後で追加するハイバネートネーミング戦略を実装する必要がありますか?

+0

"foo"という属性はありません。それに先行するアンダースコアがあり、あなたのSpringメソッドにはそれがありません。 –

+0

正確に。したがって、疑問。エンティティに "findByFoo" - > "_foo"のマッピング方法を知りたい。 – Casey

+0

カラム名にはアンダースコアしかない場合は、Javaフィールドからアンダースコアを削除し、@Columnアノテーションを使用してカスタムカラム名を指定することができます。 – dunni

答えて

1

私はドキュメント内の内容を繰り返すことができます(ただし、「役に立たない」という部分に興味があります)。 Javaコードに標準のJava規則を使用します。ストア固有の手段を使用して、プロパティーがデータベース表にマップされる方法をカスタマイズします。 JPAはそのために注釈を@Column提供しています。

+1

さて、助けてくれてありがとう。私は、フィールド名のリファクタリングと、カラムアノテーションの追加を避けるための命名戦略の使用を終了しました。春のデータにあなたの仕事をありがとう:) – Casey