web-dev-qa-db-ja.com

CrudRepositoryを拡張するSpring Boot

Spring BootアプリでHibernateを使用しています。基本的なCRUDタスクを実行するために、すべてのモデルオブジェクトに新しいCrudRepositoryを作成しています。彼らはこのように見えます:

@Repository
public interface FoobarCrudRepo extends CrudRepository<Foobar, Long> {
}

しかし、その場合は常に、不等式を含むカスタム検索クエリなど、いくつかの追加の作業を行う必要があります。私はこのようなパターンに従います:

@Repository
public class FoobarDao {

    @PersistenceContext
    EntityManager em;

    public List<Foobar> findFoobarsByDate(Date date) {
        String sql = "select fb from Foobar fb where createdDate > :date";
        ...
        return query.getResultList();
    }
}

私の質問は、これら2つの概念を1つのクラスに結合できるかどうかです。私はそれを次のように抽象クラスにしようとしました:

@Repository
public abstract class FoobarCrudRepo extends CrudRepository<Foobar, Long> {

    @PersistenceContext
    EntityManager em;

    public List<Foobar> findFoobarsByDate(Date date) {
        String sql = "select fb from Foobar fb where createdDate > :date";
        ...
        return query.getResultList();
    }

}

しかし、SpringはそのためのBeanを作成しませんでした。

どうすればこれを達成できますか?

ありがとう!

9
James Watkins

これを実現する方法はたくさんあります。絶対制御が本当に必要な場合は、これを試してください

interface FoobarRepositoryCustom{
    List<Foobar> findFoobarsByDate(Date date);
}

interface FoobarRepository extends CrudRepository<Foobar, Long>, FoobarRepositoryCustom

public class FoobarRespoitoryImpl implements FoobarRepositoryCustom{
    @PersistenceContext private EntityManager em;


    public List<Foobar> findFoobarsByDate(Date date) {
    String sql = "select fb from Foobar fb where createdDate > :date";
    ...
    return query.getResultList();
    }
}

より単純なルートに進む可能性もあり、メソッド名に基づいてクエリを自動生成できます。あなたの例では、これをFoobarCrudRepoに追加するだけで、FoobarにCreatedDateという名前のプロパティがあると仮定して、Springが残りを実行する必要があります

List<Foobar> findByCreatedDateGreaterThan(Date date);

Springがメソッド名に基づいてクエリを生成する方法のリファレンスについては、この http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methodsを参照してください。クエリ作成

17
jst

Spring Dataは完全に新しいですが、少し検索したところ、カスタムロジックを作成するためにインターフェイスを離れる必要はないという印象です-注釈付きのインターフェイスメソッド、特別な命名スキームに従うインターフェイスメソッド、またはカスタムロジックを持つデフォルトのインターフェースメソッド:

enter image description hereBaeldung:Introduction to Spring からのスクリーンショット。

ここ はドキュメントへのリンクです。 " 表4.メソッド名内でサポートされるキーワード "は、インターフェースメソッドの作成に使用できます。その名前は、作成するクエリに関する情報をコードジェネレーターに伝えます(下の表の一部を参照)。

enter image description here

1
Hervian

jPA EntityManagerを直接SQLアクションに使用できます。

public interface VerificationsRepository extends
    CrudRepository<Verification, Integer>,
    DAOAccess
{ }

interface DAOAccess {
   List findByEmail(String email);

}

class DAOAccessImpl implements DAOAccess {
   @PersistenceContext private EntityManager em;

    public List findByEmail(String email) {
        String sql =
            "select * from verifications where email = ?";
        Query query = em.createNativeQuery(sql, Verification.class)
            .setParameter(1, email);
        return query.getResultList();
    }
}
0
Bodhi Hu

ここでの問題はabstractキーワードです。

@Repository
public abstract class FoobarCrudRepo extends CrudRepository<Foobar, Long>

Springは、具象クラスでない限り、クラスのBeanを作成しません。それが豆を手に入れている理由です。

0
pmverma

これは私のために働いたものです...

@SpringBootApplication(scanBasePackages = { "com.myproject" })
@EnableJpaRepositories(basePackages="com.myproject.sprinbootapp.repository")
    @EntityScan("com.myproject.sprinbootapp.model")
    public class SpringbootAppWithDatabaseApplication {

        public static void main(String[] args) {
            SpringApplication.run(SpringbootAppWithDatabaseApplication.class, args);
        }
    }

@Service
public class TopicService {

    @Autowired
    private TopicRepository topicRepository;

    private List<Topics> topics = new ArrayList<Topics>();

    public List<Topics> getAllTopics(){
        List<Topics> listOfTopics = new ArrayList<Topics>();
        topicRepository.findAll().forEach(listOfTopics::add);;
        return listOfTopics;
    }

}

@Entity
public class Topics {

    @Id
    private String id;

    private String name;

    public Topics(){

    }
 getters and setters...
}

public interface TopicRepository extends CrudRepository<Topics, String> {

}
0
Rahul Wasnik