首页 > 解决方案 > Spring Data JPA 原生 @Query,整个实体名为 @Param

问题描述

假设我有两个实体:

class User {
  @Id private int id;
  private String name;
  private int addressId;
}

class Address {
  @Id private int id;
  private String street;
}

是否有可能做到这一点:

interface UserRepository extends CrudRepository<User, Integer> {
  @Query(nativeQuery=true,
    value=
      "select * from user "
    + "inner join address a on a.id = u.addressId "
    + "where a.street = :address.street")
  List<User> findByAddress(@Param("address") Address address);
}

那就是:接受一个实体(Address在这种情况下)作为参数,但在本机查询中引用它的一个属性(Address.street在这种情况下)?

由于各种原因,我不能@ManyToMany对这两个实体使用“正常”和 JPA 查询。

标签: javaspringspring-data-jpaspring-data

解决方案


在这里找到了答案:

https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions

这可以用来:

+ "where a.street = :#{#address.street}")

Bonus - for a.street in(...),使用集合预测:

https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/html/expressions.html#expressions-collection-projection

那是:

+ "where a.street in(:#{#address.![street]})")

推荐阅读