弹簧靴扩展 Crud存储库

我在Spring Boot应用程序中使用Hibernate。我正在为我的所有模型对象创建一个新的CrudRepository,以执行基本的CRUD任务。它们看起来像这样:

@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();
    }
}

我的问题是,我可以将这两个概念组合成一个类吗?我尝试使它成为一个抽象类,如下所示:

@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();
    }

}

但后来春天并没有为它创造豆子。

我该如何做到这一点?

谢谢!


答案 1

有很多方法可以做到这一点。如果你真的需要绝对的控制,试试这个

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有一个名为CreateDate的属性,Spring应该完成剩下的工作。

List<Foobar> findByCreatedDateGreaterThan(Date date);

有关Spring如何根据方法名称生成查询的参考,请参阅此 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation


答案 2

对Spring Data来说是全新的,但是在搜索了一下之后,我的印象是您不必离开接口来创建自定义逻辑 - 而是创建带注释的接口方法,遵循特殊命名方案的接口方法或具有自定义逻辑的默认接口方法:

enter image description here截图来自Baeldung:Spring简介

以下是文档的链接。注意“表4.方法名称内支持的关键字“,可用于创建接口方法,其名称将有关要创建的查询的信息传达给代码生成器(请参阅下表的一部分)。

enter image description here


推荐