2016-12-09 6 views
0

CrudRepositoryインターフェイスにカスタムメソッドを追加することは可能ですか?Spring Hibernate - FindByObject CrudRepository

私はFoobarと呼ばれるエンティティクラスを持つ次のDAOを持っています。この質問のために、エンティティクラスは任意の数のフィールド/列を持つことができます。

package com.bar 
import org.springframework.data.repository.CrudRepository; 
import com.bar.Foobar 
public interface FoobarCrudRepo extends CrudRepository<Foobar, Long> { 
    public Foobar findByObject(Foobar JObj); 
} 

このコードは、カスタムメソッドを削除するとうまく動作しますが、上記のように追加するとエラーが発生します。この投稿(Update or SaveorUpdate in CRUDRespository, Is there any options available)から私が理解したところでは、インターフェイスに追加のメソッドを追加するだけで済み、JPARepoは残りの部分を処理します。しかし、私は以下のエラーが発生しています。私の思考 - それはこのカスタムクラスについて多くを知らない。

は、ここに私のエラーです:

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

は、なぜ私はあなたが尋ねるかもしれません)(findbyObjectをしたいですか?そのため、DBにオブジェクトがすでに追加されているかどうかを確認してチェックを行い、重複したデータ行をDBに挿入しないようにします。

ご意見ありがとうございます、ありがとうございます。

+0

オブジェクト全体をキーとして使用して、オブジェクトがデータベースに存在するかどうかを確認したいのですか?なぜ一意のIDを持っていないのですか? – CraigR8806

+0

キーとしてではなく、オブジェクトとして。私の理解では、uniqueIDはDBに挿入される前に生成されています。つまり、それを挿入する前にuniqueIDを見つける方法は? – rj2700

+1

あなたがしたいことをするには、オブジェクトがユニークである必要があるフィールドだけを選んで、現在DB内のものと照合する必要があります。 – CraigR8806

答えて

1

FindByObjectを呼び出すことができますIDによるオブジェクトは、オブジェクトを探していないことが判明し、それは文字通りあなたのFoobarクラスのフィールドを探しますObjectと命名されました。他の人が触れたように、オブジェクトの他のフィールドをチェックして、オブジェクトがすでに存在するかどうかを調べることができます。あなたのFoobarクラスがString nameString emailフィールドを持っている場合

はたとえば、あなたがpublic Foobar findByNameAndEmail(String name, String email) {}のようなメソッドを作成することができ、これらの基準を満たしていたデータベースのレコードがあった場合、これはfoobarのオブジェクトを返します。

すべてのクエリメソッドはSQLを複製するので、SQLでオブジェクト(レコード)で検索できますか?いいえ、それは意味をなさないからです。特定の条件が満たされている場合、クエリはレコード(オブジェクト)を返します。

+0

Hibernateはこのシナリオを考えていないのは驚きです。単純な例として、M:1の関係を持つ従業員と部署。 SQLでは、従業員に関する情報を一方に、従業員に関する情報を他方に挿入します。従業員テーブルでは、FK departmentIDを共有することによって、複数の従業員を同じ部門に所属させることができます。これにより、部門テーブル内の行を再利用することができます。 – rj2700

+0

'@ ManyToOne'アノテーションを使って、あなたが話していることをHibernateで行うことができます。私は完全に型付けされたSQLでできること全てを行うのは非常に柔軟で、かなり簡単なので、Hibernateについてもっと学ぶことをお勧めします。 –

+0

私はまだ冬眠を学ぼうとしていますが、@ManyToOneアノテーションでも重複した行が追加されます – rj2700

0

あなたのコードはfindByの背後にある名前をとり、where where条件を作成しようとするため、コードが機能しません。

のでfindByObjectが作成されます。

where object = ? 

あなたは

findOne(?) 
+0

この問題は、findOne()がデータ型に一致するparam IDを取る必要があることです(この場合はLongになります)。私はオブジェクトによって検索しているので、無効です。 – rj2700

+0

もちろん、あなたはオブジェクトがIDを取得し、これを引数として渡すことができます。私は問題が表示されません –

+0

私はIDを持っていない - それは挿入時に作成され、私はその前にオブジェクトを持っています。 – rj2700

関連する問題