Spring Data JPA 原生 @Query,整个实体名为 @Param

lev*_*ied 2 java spring spring-data spring-data-jpa

假设我有两个实体:

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

class Address {
  @Id private int id;
  private String street;
}
Run Code Online (Sandbox Code Playgroud)

是否有可能做到这一点:

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);
}
Run Code Online (Sandbox Code Playgroud)

也就是说:接受一个实体(Address在本例中)作为参数,但Address.street在本机查询中引用其属性之一(在本例中)?

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

lev*_*ied 8

在这里找到了答案:

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

这可以使用:

+ "where a.street = :#{#address.street}")
Run Code Online (Sandbox Code Playgroud)

奖励 - 对于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]})")
Run Code Online (Sandbox Code Playgroud)