Jam*_*ins 8 java spring hibernate spring-data-jpa spring-boot
我在Spring Boot应用程序中使用Hibernate.我正在为我的所有Model对象创建一个新的CrudRepository,以执行基本的CRUD任务.它们看起来像这样:
@Repository
public interface FoobarCrudRepo extends CrudRepository<Foobar, Long> {
}
Run Code Online (Sandbox Code Playgroud)
但后来我总是需要做一些额外的事情,比如具有不等式的自定义搜索查询等.我遵循这样的模式:
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以将这两个概念合并为一个类吗?我试着把它变成一个抽象类,如下所示:
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是Spring没有为它创建一个bean.
我怎么能做到这一点?
谢谢!
jst*_*jst 17
有很多方法可以实现这一目标.如果你真的需要绝对控制试试这个
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();
}
}
Run Code Online (Sandbox Code Playgroud)
还可以使用更简单的路径,并可以根据方法名称自动为您生成查询.在你的例子中,你可以将它添加到你的FoobarCrudRepo中,Spring应该做其余的假设Foobar有一个名为CreatedDate的属性
List<Foobar> findByCreatedDateGreaterThan(Date date);
Run Code Online (Sandbox Code Playgroud)
有关Spring如何根据方法名称生成查询的参考,请参阅http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation
| 归档时间: |
|
| 查看次数: |
26428 次 |
| 最近记录: |