当前位置: 首页 > 知识库问答 >
问题:

Spring JPA属性表达式通过列表中项目的交集查找

戚同
2023-03-14

如何使用属性表达式编写JPA存储库方法来检查列表中是否存在多个项目或这些项目的属性?我可以在列表中查找单个项目,请参阅下面的邮政编码,但我正在尝试编写一种检查多个邮政编码的方法,其中结果集中的每个人在其地址列表中都有两个邮政编码。

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {
    // Works
    Set<Person> findAllByAddresses_ZipCode(String zip);

    // Doesn't work - does not return expected results
    Set<Person> findAllByAddresses_ZipCode_And_Addresses_ZipCode(String zip1, String zip2);
}

我目前的做法是用2个邮政编码提取两组,然后找到两组的交集:

public @ResponseBody
    Iterable<Person> personsWithBothZipCodes(@PathVariable("zip1") String zip1,
                                             @PathVariable("zip2") String zip2) {

    Set<Person> a = personRepository.findAllByAddresses_ZipCode(zip1);
    Set<Person> b = personRepository.findAllByAddresses_ZipCode(zip2);

    // Only return results that contain both zip1 and zip2.
    a.retainAll(b);

    return a;
}

实体如下所示:

@Entity
public class Person
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // zipcode is a String property on an Address.
    @OneToMany(targetEntity = com.data.Address.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Address> addresses = new ArrayList<Address>();
    ...
}

有没有办法将其作为方法头的一部分写入?相关文件

共有2个答案

戚飞雨
2023-03-14

也许您可以使用JPQL查询(如注释中所建议的)?

@Query("from Person as person" +
" join person.addresses as address1 with address1.zipCode = ?1" +
" join person.addresses as address2 with address2.zipCode = ?2")
Set<Person> findByZipCodes(String zipCode1, String zipCode2);

还没有真正复制你的案例,但它可能会起作用。

焦宁
2023-03-14

是的,只需在查询中添加单词

Set<Person> findAllByAddresses_ZipCodeIn(Set<String> zip);

然后在控制器中,您可以执行以下操作:

public @ResponseBody Iterable<Person> personsWithBothZipCodes(@PathVariable("zip1") String zip1, @PathVariable("zip2") String zip2) {

    Set<String> zipSet = new HashSet<>();
    zipSet.add(zip1);
    zipSet.add(zip2);

    Set<Person> a = personRepository.findAllByAddresses_ZipCodeIn(zipSet);

    return a;
}

不知道这是否可行,但可以试试

Set<Person> findAllByAddresses_ZipCodeInAndZipCodeIn(Set<String> zip1, Set<String> zip2);

public @ResponseBody Iterable<Person> personsWithBothZipCodes(@PathVariable("zip1") String zip1, @PathVariable("zip2") String zip2) {

    Set<String> zipSet1 = new HashSet<>();
    zipSet1.add(zip1);

    Set<String> zipSet2 = new HashSet<>();
    zipSet2.add(zip2);

    Set<Person> a = personRepository.findAllByAddresses_ZipCodeInAndZipCodeIn(zipSet1, zipSet2);

    return a;
}
 类似资料:
  • 问题内容: 这个问题基于MongoDB,如何通过选择多个条件来检索所选项目。就像Mysql中的IN条件一样 选择*从场所列表WHERE场所ID输入(场所1,场所2) 我已经附加了我使用过的json数据结构。 [参考:MONGODB的JSON STRUCTUE] 。 例如,它具有一个场所列表,然后在场所列表内,它具有多个属性场所ID,用户代理名称的总和以及总计数作为值。用户代理表示用户Os,浏览器和

  • 问题内容: 我正在尝试使用匹配其id属性的正则表达式过滤html表。我究竟做错了什么?我正在尝试实现的代码: 我得到的错误:preg_match期望第二个参数是一个字符串,给定数组。 问题答案: 根据DOM(具有命名空间等),属性仍然是一个复杂的元素。采用: 现在,我们需要一个布尔值返回,所以: 顺便说一句:对于更复杂的问题,您当然可以偷偷检查一下这是怎么回事: 很遗憾,我们没有可用的XPATH

  • 接下来我们来看看属性表达式。在之前的例子中,属性表达式只涉及到被管理的实体类的直接属性,在创建查询时我们已经确保解析出的属性是被管理实体类的属性之一。实际上,我们可以定义嵌套属性。假设Person类有一个Address,Address中又有ZipCode。在这种情况下,下面方法的方法名会通过x.address.zipCode来检索属性。 List<Person> findByAddressZipC

  • 问题内容: 假设我有以下型号 在一个视图中,我有一个带有活动过滤器的列表,称为category。我想过滤所有具有类别标签的照片对象。 我试过了: 但这匹配类别中的任何项目,而不是所有项目。 因此,如果类别是[‘holiday’,’summer’],我希望Photo带有假日和夏季标签。 能做到吗? 问题答案: 正如jpic和sgallen在评论中所建议的那样,可以.filter()为每个类别添加一个

  • 我正在尝试过滤scala中对象列表的列表属性。例如: 用java定义的类 我的过滤器函数返回字符串列表而不是结果列表 UPDATE我想取回listOf中的所有结果,其中每个结果的名称属性被过滤。

  • 下午好!有一个对象包含类型为List的字段,是否可以通过表达式参数在注释中生成的值来设置T类型的每个(某些)字段? 例如: 目标对象: 映射器接口: 如何实现这样的想法?在文档中,我只找到了具有1:1映射的示例。 编辑: 此外,我尝试使用以下方法: 但在这种情况下,我对限定符有一些错误。