在这篇文章中,我们将为您详细介绍使用SpringBootCrudRepository过滤数据的内容,并且讨论关于springboot过滤器的相关问题。此外,我们还会涉及一些关于(转)CrudRepos
在这篇文章中,我们将为您详细介绍使用Spring Boot CrudRepository过滤数据的内容,并且讨论关于spring boot 过滤器的相关问题。此外,我们还会涉及一些关于(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别、CityESServiceImpl required a bean of type ''org.spring.springboot.repository.CityRepository'' that could not be found.、java – Spring Boot扩展CrudRepository、java – Spring CrudRepository异常的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 使用Spring Boot CrudRepository过滤数据(spring boot 过滤器)
- (转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别
- CityESServiceImpl required a bean of type ''org.spring.springboot.repository.CityRepository'' that could not be found.
- java – Spring Boot扩展CrudRepository
- java – Spring CrudRepository异常
使用Spring Boot CrudRepository过滤数据(spring boot 过滤器)
我有一个简单的REST服务,可通过Spring boot访问数据CrudRepository
。
该存储库已经实现了分页和排序功能,如下所示:
public interface FlightRepository extends CrudRepository<Flight, Long> { List<Flight> findAll(Pageable pageable);}
调用它:
Sort sort = new Sort(direction, ordering);PageRequest page = new PageRequest(xoffset, xbase, sort);return flightRepo.findAll(page);
我还想向此存储库添加过滤(例如,仅返回带有的实体id > 13 AND id <27
)。CrudRepository似乎不支持此功能。有什么方法可以实现这一目标,还是我需要使用其他方法?
感谢您的提示!
答案1
小编典典一种替代方案,可以通过标准API或QueryDSL使用规范模式,可以解决您在上述注释中必须为每种参数组合创建查询方法的问题。
出于对以下方面的关注,下面概述了两种方法:
对于更大的应用程序,查询方法的数量可能会增加,这是因为-这是第二点-
查询定义了一组固定的条件。为避免这两个缺点,如果您能提出一组可以动态组合以构建查询的原子谓词,这不是很酷吗?
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-
and-querydsl/
我发现QueryDSL易于使用。您只需要定义一个接口方法,然后就可以将参数的任意组合传递给谓词。
例如
public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> { public List<User> findAll(Predicate predicate);}
并查询:
repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M)));repository.findAll(QUser.user.address.town.eq("Edinburgh"));repository.findAll(QUser.user.foreName.eq("Jim"));
其中QUser是QueryDSL自动生成的类。
http://docs.spring.io/spring-
data/jpa/docs/current/api/index.html?org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.html
http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html
更新资料
从Spring Data模块的Gosling版本开始,现在支持从Web应用程序中的HTTP参数自动生成谓词。
https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-
gosling#querydsl-web-support
(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别
1. 简介
本文介绍三种不同的 Spring Data repository 和它们的功能,包含以下三种:
- CrudRepository
- PagingAndSortingRepository
- JpaRepository
简单地说,Spring Data 中的每个 repository 都继承自Repository
接口,但是,除此之外,它们每个又有不同的功能。
2. Spring Data Repositories
首先介绍 JpaRepository
,它继承自 PagingAndSortingRepository
,而 PagingAndSortingRepository
又继承自 CrudRepository
。
每个都有自己的功能:
- CrudRepository 提供 CRUD 的功能。
- PagingAndSortingRepository 提供分页和排序功能
- JpaRepository 提供 JPA 相关的方法,如刷新持久化数据、批量删除。
由于三者之间的继承关系,所以 JpaRepository 包含了 CrudRepository 和 PagingAndSortingRepository 所有的 API。
当我们不需要 JpaRepository 和 PagingAndSortingRepository 提供的功能时,可以简单使用 CrudRepository。
下面我们通过例子更好地理解它们提供的 API。
首先创建 Product 实体:
@Entity
public class Product { @Id private long id; private String name; // getters and setters }
然后实现通过名称查询 Product 的操作:
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> { Product findByName(String productName); }
这样就实现了通过名称查询 Product 的方法,Spring Data Repository 根据方法名自动生成相应的实现。
3. CrudRepository
先看下 CrudRepository
接口的源码:
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); T findOne(ID primaryKey); Iterable<T> findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); }
方法功能介绍:
- save (...) – 保存多个对象。这里,我们可以传多个对象批量保存。
- findOne (...) – 根据传入的主键值获取单一对象。
- findAll (...) – 查询数据库中所有对象。
- count () – 返回表中记录总数。
- delete (...) – 根据传入的对象删除记录。
- exists (...) – 根据传入的主键值判断对象是否存在。
CrudRepository 接口看起来非常简单,但实际上它提供了所有基本查询保存等操作。
4. PagingAndSortingRepository
PagingAndSortingRepository 接口的源码如下:
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
该接口提供了 findAll(Pageable pageable)
这个方法,它是实现分页的关键。
使用 Pageable 时,需要创建 Pageable 对象并至少设置下面 3 个参数:
- 1、 每页包含记录数
- 2、 当前页数
- 3、 排序
假设我们要显示第一页的结果集,一页不超过 5 条记录,并根据lastName
升序排序,下面代码展示如何使用 PageRequest 和 Sort 获取这个结果:
Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName"));
Pageable pageable = new PageRequest(0, 5, sort);
5. JpaRepository
JpaRepository 接口源码:
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { List<T> findAll(); List<T> findAll(Sort sort); List<T> save(Iterable<? extends T> entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable<T> entities); }
简单介绍下每个方法的作用:
- findAll () – 获取数据库表中所有实体。
- findAll (…) – 根据条件获取排序后的所有实体。
- save (…) – 保存多个实体。这里可以传入多个对象批量保存。
- flush () – 将所有挂起的任务刷新到数据库。
- saveAndFlush (…) – 保存实体并实时刷新到数据库。
- deleteInBatch (…) – 删除多个实体。这里可以传入多个对象并批量删除。
显然,JpaRepository 接口继承自 PagingAndSortingRepository,PagingAndSortingRepository 继承自 CrudRepository,所以 JpaRepository 拥有 CrudRepository 所有的方法。
6. Spring Data Repositories 的缺点
尽管 Spring Data Repositories 有很多优点,但是它们也有缺点:
- 这种方式把我们的代码和类库以及具体抽象(如:Page 和 Pageable)绑定。它们不是这个类库独有的,但是我们必须小心不要暴露这些内部实现的细节。
- 通过继承 CrudRepository 接口,我们暴露了所有方法。这可能满足大部分情况,但是我们可能会遇到这样的情况:我们希望获得对公开的方法的更细粒度的控制,例如创建一个不包含 save (...) 和 delete (...) 的 ReadOnlyRepository,此时继承 CrudRepository 就不满足要求了。
CityESServiceImpl required a bean of type ''org.spring.springboot.repository.CityRepository'' that could not be found.
Bean ''validator'' of type [class org.springframework.validation.beanvalidation.LocalValidatorFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-04-08 13:43:40.636 INFO 9300 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2019-04-08 13:43:40.651 INFO 9300 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
2019-04-08 13:43:40.652 INFO 9300 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.11
2019-04-08 13:43:40.765 INFO 9300 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-04-08 13:43:40.765 INFO 9300 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1407 ms
2019-04-08 13:43:40.883 INFO 9300 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: ''dispatcherServlet'' to [/]
2019-04-08 13:43:40.887 INFO 9300 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: ''characterEncodingFilter'' to: [/*]
2019-04-08 13:43:40.887 INFO 9300 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: ''hiddenHttpMethodFilter'' to: [/*]
2019-04-08 13:43:40.887 INFO 9300 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: ''httpPutFormContentFilter'' to: [/*]
2019-04-08 13:43:40.887 INFO 9300 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: ''requestContextFilter'' to: [/*]
2019-04-08 13:43:40.937 WARN 9300 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ''cityRestController'': Unsatisfied dependency expressed through field ''cityService''; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ''cityESServiceImpl'': Unsatisfied dependency expressed through field ''cityRepository''; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ''org.spring.springboot.repository.CityRepository'' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2019-04-08 13:43:40.943 INFO 9300 --- [ main] utoConfigurationReportLoggingInitializer :
Error starting ApplicationContext. To display the auto-configuration report re-run your application with ''debug'' enabled.
2019-04-08 13:43:41.017 ERROR 9300 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Field cityRepository in org.spring.springboot.service.impl.CityESServiceImpl required a bean of type ''org.spring.springboot.repository.CityRepository'' that could not be found.
Action:
Consider defining a bean of type ''org.spring.springboot.repository.CityRepository'' in your configuration.
java – Spring Boot扩展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(); } }
我的问题是,我可以将这两个概念合并为一个类吗?我试着把它变成一个抽象类,如下所示:
@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.
我怎么能做到这一点?
谢谢!
解决方法
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如何根据方法名称生成查询的参考,请参阅此http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation
java – Spring CrudRepository异常
@Repository public interface IUserRepository extends CrudRepository<User,String> { }
用户是我的@R_301_6250@用户表的实体. CrudRepository将以下操作添加到存储库:
> delete(String ID)
> findOne(String ID)
>保存(用户用户)
如documentation所述,删除和查找操作会抛出IllegalArgumentException,以防给定的id为null,而保存操作不会引发任何异常.
问题是,CrudRepository的javadoc没有提到这些操作抛出的其他异常.例如,如果在DB中不存在提供的ID,则不会指出delete(String ID)操作将抛出一个EmptyResultDataAccessException异常.
在保存(用户)操作的javadoc中,不清楚在插入一个破坏一个数据完整性约束的新用户(在唯一字段和外键上)时会抛出哪些异常.此外,它不会警告您是否正在编写新的或存在的用户:它只是创建一个新的用户或覆盖(如果存在)(因此它是一个插入更新操作).
在企业应用程序中,我应该能够捕获一个操作可以抛出的每个可抛出的异常,我应该在操作的javadoc中读取它.
您是否知道有关CrudRepository异常的明确文档?
谢谢
解决方法
有四个主要组 –
> NonTransientDataAccessException – 除非修正异常的原因,否则相同操作的重试将会失败.因此,如果您传递非现有的ID,例如,除非@R_301_6250@中存在该id,否则它将失败.
> RecoverableDataAccessException – 这些是前一个的“相反” – 可恢复的异常 – 在一些恢复步骤之后. api文档中的更多详细信息
> ScriptException – sql相关异常,当尝试处理不是格式良好的脚本时.
> TransientDataAccessException – 这些是在没有任何明确步骤的情况下可以恢复的例外.当@R_301_6250@有超时时,您将在几秒钟后重试.
也就是说,找到关于所有异常的文档的理想场所在于API本身 – 只需要遍历DataAccessException的层次结构.
关于使用Spring Boot CrudRepository过滤数据和spring boot 过滤器的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别、CityESServiceImpl required a bean of type ''org.spring.springboot.repository.CityRepository'' that could not be found.、java – Spring Boot扩展CrudRepository、java – Spring CrudRepository异常的相关信息,请在本站寻找。
本文标签: