如何在 Spring Boot CrudRepository 中搜索数组

Posted

技术标签:

【中文标题】如何在 Spring Boot CrudRepository 中搜索数组【英文标题】:How to search through array in Spring Boot CrudRepository 【发布时间】:2018-07-03 14:55:40 【问题描述】:

说,我有以下实体类:

Person.java

@Entity
public class Person 
  @Id
  private String name;

  private String[] cars;

  // Constructor, getters and setters

还有存储库:

PersonRepository.java

public interface PersonRepository extends CrudRepository<Person, String> 

   // this is unclear!
   List<Person> getAllByCars...(String car)

有没有一种方法可以返回所有人,其汽车数组包含一辆给定的汽车(上面的字符串参数)?

对我来说,似乎所有受支持的 JPA 关键字都只能处理单个元素,而不能处理数组。

感谢您的帮助!

【问题讨论】:

汽车不应该是另一个实体吗? 【参考方案1】:

理想情况下,您应该像这样将汽车声明为单独的实体

@Entity
public class Person 
  @Id
  private String name;

  private List<Car> cars;

  // Constructor, getters and setters

如果不是,您至少应该将 Array 更改为 List。 改变

private String[] cars;

@ElementCollection
private List<String> cars;

那么你必须像这样写一个查询

@Query("select p from Person p WHERE :car in elements(p.cars)")
List<Person> getAllByCars...(@Param("car") String car)

【讨论】:

感谢您的回答!您建议的查询起到了作用。由于我在这个例子中只使用了一个字符串列表,我看不出有理由为此实现一个单独的实体 b.t.w.我必须用 @ElementCollection 注释汽车才能使其工作 抱歉忘记提了。更新了答案 在将 String[] 更改为 List 之后,您可以像这样在 CrudRepository 中定义一个方法,这样就可以完成这项工作 ---- List findAllByCars(String car) 【参考方案2】:

我猜测您当前如何存储汽车信息并提出可能的解决方案:

@Entity
public class Car 
  @Id
  private String name;

  @Column
  private String person_name;


public interface CarRepository extends JpaRepository<Car, String> 
    //Result will have all cars with the person_name identifying the Person @Entity
    List<Car> findByName(String name);

【讨论】:

以上是关于如何在 Spring Boot CrudRepository 中搜索数组的主要内容,如果未能解决你的问题,请参考以下文章

spring boot学习02如何在spring boot项目中访问jsp

如何在 spring-boot 中替换最新的 Jetty 9?

如何在 spring-boot 中配置 Jetty(很容易?)

如何在 spring-boot-2 中添加 WebRequestTraceFilter?

如何在 gradle 中获取 spring-boot 依赖版本?

如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?