GVKun编程网logo

使用Spring Boot CrudRepository过滤数据(spring boot 过滤器)

1

在这篇文章中,我们将为您详细介绍使用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 过滤器)

使用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 之间的区别

(转) 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 有很多优点,但是它们也有缺点:

  1. 这种方式把我们的代码和类库以及具体抽象(如:Page 和 Pageable)绑定。它们不是这个类库独有的,但是我们必须小心不要暴露这些内部实现的细节。
  2. 通过继承 CrudRepository 接口,我们暴露了所有方法。这可能满足大部分情况,但是我们可能会遇到这样的情况:我们希望获得对公开的方法的更细粒度的控制,例如创建一个不包含 save (...) 和 delete (...) 的 ReadOnlyRepository,此时继承 CrudRepository 就不满足要求了。



CityESServiceImpl required a bean of type ''org.spring.springboot.repository.CityRepository'' that could not be found.

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

java – Spring Boot扩展CrudRepository

我在 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.

我怎么能做到这一点?

谢谢!

解决方法

有很多方法可以实现这一目标.如果你真的需要绝对控制试试这个
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异常

java – Spring CrudRepository异常

我有这个 Spring数据CrudRepository处理DB上的CRUD操作.
@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异常的明确文档?

谢谢

解决方法

Spring具有内置的异常转换机制,因此JPA持久性提供程序抛出的所有异常都转换为Spring的 DataAccessException – 对于所有使用@Repository(或配置)注释的bean.

有四个主要组 –

> 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异常的相关信息,请在本站寻找。

本文标签: