Spring Boot扩展了CrudRepository

时间:2015-06-17 01:35:15

标签: java spring hibernate spring-boot spring-data-jpa

我在Spring Boot应用程序中使用Hibernate。我为我的所有Model对象创建了一个新的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();
    }

}

但是Spring并没有为它创造一个bean。

我该如何做到这一点?

谢谢!

5 个答案:

答案 0 :(得分:14)

有很多方法可以实现这一目标。如果你真的需要绝对控制试试这个

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中,Spring应该做其余的假设Foobar有一个名为CreatedDate的属性

List<Foobar> findByCreatedDateGreaterThan(Date date);

有关Spring如何根据方法名称生成查询的参考,请参阅此in the official documentation

答案 1 :(得分:1)

对Spring Data完全陌生,但经过一番搜索,我的印象是你不必离开界面来创建自定义逻辑 - 而是你要创建一个带注释的接口方法,一个遵循特殊命名的接口方法方案或具有自定义逻辑的默认接口方法:

enter image description here Baeldung: Introduction to Spring

的屏幕截图

Here是文档的链接。注意&#34; table 4. Supported keywords inside method names&#34;可用于创建接口方法,其名称将信息传递给代码生成器,以创建要创建的查询(参见下表的部分内容)。

enter image description here

答案 2 :(得分:0)

此处的问题是abstract关键字。

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

除非是一个具体的类,否则Spring不会为类创建一个bean。 这就是你为它获得豆子的原因。

答案 3 :(得分:0)

这对我有用......

var params = {
  DBInstanceIdentifier: 'STRING_VALUE', /* required */
  DBSnapshotIdentifier: 'STRING_VALUE'
};
rds.stopDBInstance(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

答案 4 :(得分:0)

我们可以将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();
    }
}