Spring boot 动态查询

2024-04-18

我的网络应用程序中有一个过滤器,允许按车辆类型、品牌、燃料、州和城市进行搜索,但所有这些过滤器都是可选的。

我怎样才能使用存储库来做到这一点。

控制器类

@RequestMapping(value = "/vehicle/search", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public Iterable<Veiculo> findBySearch(@RequestParam Long vehicletype, @RequestParam Long brand, 
        @RequestParam Long model, @RequestParam Long year, 
        @RequestParam Long state, @RequestParam Long city) {
    return veiculoService.findBySearch(vehicletype, brand, model, year, state, city);
}

服务等级

public Iterable<Vehicle> findBySearch(Long vehicletype, Long brand, Long model, Long year, Long state, Long city) {
    if(vehicletype != null){
        //TODO: filter by vehicletype
    }
    if(brand != null){
        //TODO: filter by brand
    }
    if(model != null){
        //TODO: filter by model
    }

    //OTHER FILTERS
    return //TODO: Return my repository with personal query based on filter
}

我还没有实现任何东西,因为我不明白如何做这个过滤器。

车辆类别

@Entity
@Table(name = "tb_veiculo")
public class Veiculo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "veiculo_opcionais", 
    joinColumns = @JoinColumn(name = "veiculo_id", referencedColumnName = "id"),
    inverseJoinColumns = @JoinColumn(name = "opcional_id", referencedColumnName = "id"))
    private List<Opcional> opcionais;

    @JsonIgnore
    @OneToMany(mappedBy = "veiculo", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<VeiculoImagem> veiculoImagens;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "cambio_id", foreignKey = @ForeignKey(name = "fk_cambio"))
    private Cambio cambio;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "combustivel_id", foreignKey = @ForeignKey(name = "fk_combustivel"))
    private Combustivel combustivel;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "cor_id", foreignKey = @ForeignKey(name = "fk_cor"))
    private Cor cor;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "modelo_id", foreignKey = @ForeignKey(name = "fk_modelo"))
    private Modelo modelo;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "usuario_id", foreignKey = @ForeignKey(name = "fk_usuario"))
    private Usuario usuario;

    @Column(name = "anoFabricacao", nullable = false)
    private int anoFabricacao;

    @Column(name = "anoModelo", nullable = false)
    private int anoModelo;

    @Column(name = "quilometragem", nullable = false)
    private int quilometragem;

    @Column(name = "porta", nullable = false)
    private int porta;

    @Column(name = "valor", nullable = false)
    private double valor;

    //GETTERS AND SETTERS

车辆类型和品牌来自另一张表...我是葡萄牙语,我已将代码翻译成英语...

当它发生时,我需要做什么?


您可以使用 Spring 的规范 API,它是 JPA 的条件 API 的包装器,允许您创建更多动态查询。

就你而言,我假设你有一个Vehicle具有字段的实体brand, year, state, city, ... .

如果是这种情况,您可以编写以下规范:

public class VehicleSpecifications {
    public static Specification<Vehicle> withCity(Long city) {
        if (city == null) {
            return null;
        } else {
            // Specification using Java 8 lambdas
            return (root, query, cb) -> cb.equal(root.get("city"), city);
        }
    }

    // TODO: Implement withModel, withVehicleType, withBrand, ...
}

如果您必须进行联接(例如,如果您想检索Vehicle.city.id)那么你可以使用:

return (root, query, cb) -> cb.equal(root.join("city").get("id"), city);

现在,在您的存储库中,您必须确保从JpaSpecificationExecutor, 例如:

public interface VehicleRepository extends JpaRepository<Vehicle, Long>, JpaSpecificationExecutor<Vehicle> {

}

通过从此接口扩展,您将可以访问findAll(Specification spec) http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaSpecificationExecutor.html#findAll-org.springframework.data.jpa.domain.Specification-允许您执行规范的方法。如果需要组合多种规格(通常一个过滤器=一种规格),可以使用Specifications http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/Specifications.html class:

repository.findAll(where(withCity(city))
    .and(withBrand(brand))
    .and(withModel(model))
    .and(withVehicleType(type))
    .and(withYear(year))
    .and(withState(state)));

在上面的代码示例中,我使用静态导入Specifications.where并为VehicleSpecifications.*让它看起来更具声明性。

你不必写if()此处的声明因为我们已经将它们写在VehicleSpecifications.withCity()。只要你回来nullSpring 将忽略这些方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring boot 动态查询 的相关文章

随机推荐

  • Axis2C 非官方与 Axis2C 员工

    我将开发一个应用程序 该应用程序将使用一些基于 SOAP 的 Web 服务框架 我做了一些研究 我有点喜欢 Axis2C 框架 但在一些主题中 我发现最初的 Axis2C 实现存在内存泄漏 并且它的官方开发已停止 幸运的是 有 Axis2C
  • 我可以在浏览器中启动 socket.io/websocket 服务器吗?

    之前有人问过这个问题 答案是否定的 但是现在 有了 browserify webpack 我可以像在服务器上那样编写代码吗 它会在浏览器中运行 还是有任何限制使这变得不可能 你不能 在浏览器中启动服务器需要访问浏览器中根本不存在的低级功能
  • 如何让 ESLint 在 VSCode 中检查 HTML 文件?

    我有一个 Javascript 浏览器项目分为多个文件 并且无法让 ESLint 在同一全局范围下对 HTML 文件的脚本标记进行 lint 处理 以便一个文件中的类和函数的声明和调用可以在另一个文件中识别 这是我的项目结构 这是食物的内容
  • UnknownEntityTypeException:无法找到持久化器(Hibernate 5.0)

    在下面的代码中 当我尝试执行时Main java我遇到异常 Exception in thread main org hibernate UnknownEntityTypeException Unable to locate persist
  • 如何在方案中向后打印字符串?

    我知道如果我按照以下方式编写方案代码并输入 单词 a b c 它将以相同的顺序输出列表 您能告诉我是否有一种方法可以以相反的顺序打印出来 例如 列出 c b a 它需要是我以相反顺序打印出来的用户输入 所以 我不能称之为 反向 a b c
  • jquery add方法及实现

    好的 从我之前的帖子中我得到了很多好的反馈 我开始这个问题是为了开始一个新问题并添加我拥有的完整代码 我知道有些事情搞砸了 但这是我的方法和实现 jquery validator addMethod passwordRules functi
  • 使用 Json.net 仅将接口属性序列化为 JSON

    有了这样一个简单的类 接口 public interface IThing string Name get set public class Thing IThing public int Id get set public string
  • enumerateBodiesAlongRayStart 在 Xcode 6 中将“Chance”打印到控制台

    我正在使用 enumerateBodiesAlongRayStart 并且此方法不断地将单词 Chance 打印到我的控制台 有什么办法可以抑制这种情况吗 这是怎么回事 self gameScene physicsWorld enumera
  • std::ignore 用于忽略未使用的变量

    这是一个好的使用方法吗std ignore忽略未使用的变量 假设我有一个这样的函数 void func int i for some reason I don t need i anymore but I cannot change sig
  • MSTest - 如何为 UnitTest 项目初始化 log4net?

    我有一个 Visual Studio 单元测试项目 用于测试 ASP NET MVC 项目 添加程序集级别log4net Config XmlConfiguratorAssemblyInfo cs 的属性不起作用 SO 上的其他人发现他们必
  • 多个参与者,相同的用例 [用例]

    我试图描述一个用例 其中系统内的多个参与者可以执行相同的活动 例如 假设 作为示例 我想要使用 更新客户端 用例 但几个已确定的参与者可以执行此操作 Manager Chief Executive Customer Service Repr
  • 一个单元如何测试基于过程或基于事件的代码部分

    我确信来自这个演示文稿 http www masukomi org talks unit testing talk 2 index xul data slide data txt page2以及网站上的其他评论 我需要学习单元测试 我还意识
  • 将事件发送到特定线程

    我有一种情况 我想要一个线程来处理一些顺序逻辑 该线程有时需要与主线程交互才能更新用户输入 但它应该继续运行 否则不会影响主线程 我希望以事件驱动的方式执行此操作 以便主线程不必为中断而极力控制其他线程 做这个的最好方式是什么 是否有类似于
  • 为什么这个 SwiftUI Picker 代码不起作用?

    Xcode 11 2 1 下面的代码是一个包含两个组件的简单表单 选择器 选择字母 和文本 显示所选字母 代码编译并运行 但是当选择一个字母时 它不会出现在 选定 文本中 此外 第一次 仅 选择一个字母时 Xcode 会显示一个 虚假的 运
  • Graphics2D:在白色上绘制黑色?

    我确信这是一个非常愚蠢的问题 但我找不到答案 我对 Java2D API 没有经验 我正在尝试创建一个图像并将其写入 GIF 或 PNG 并且我希望它在白色背景上使用黑色笔 如果我不设置任何颜色 我会得到黑底白字 如果我使用 setPain
  • 在多级列 pandas 数据框中创建列的更好方法

    假设我有一个 pandas 多层列数据框架df像这样 A B gt first level x y x y gt second level 0 5 5 1 5 1 3 1 4 7 2 1 4 10 20 3 50 8 7 8 如何创建一个新
  • 如何在 Perl 中读取不断更新的文件?

    您好 我想通读一个文件 进入睡眠状态 然后检查是否有新记录写入该文件 如果是 我想处理记录 如果否 则返回睡眠并稍后再次检查 在永远循环中 我以为我可以做这样的事情 但是在它第一次读取文件之后 它似乎永远不会获取添加到文件中的新记录 ope
  • 数据变量没有从 Vue.js 中使用 Vuex 的计算属性的观察者更新

    Fiddle https jsfiddle net mjvu6bn7 https jsfiddle net mjvu6bn7 我有一个计算属性的观察者 它依赖于 Vuex 存储变量 该变量是异步设置的 当这个计算属性发生变化时 我试图设置
  • 如何使用 SVN 和 .NET 以编程方式进行文件版本控制?

    我们有一个报告生成器 每天 它都会将数据写入 Excel 文件 出于版本控制和文件数据安全的原因 我们需要更改此文件 并将更改提交到存储库中 您推荐您使用过的任何 net SVN API 吗 你应该看看SharpSvn http sharp
  • Spring boot 动态查询

    我的网络应用程序中有一个过滤器 允许按车辆类型 品牌 燃料 州和城市进行搜索 但所有这些过滤器都是可选的 我怎样才能使用存储库来做到这一点 控制器类 RequestMapping value vehicle search method Re