Spring Data REST是基于Spring Data项目的一个模块,它可以将Spring Data存储库自动暴露为RESTful资源。在2.6.10版本中,它提供了通过REST API按嵌入属性值查找的功能。
在Repository接口中定义查询方法:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByAddress_City(String city);
}
对应的REST端点会自动生成,可以通过以下URL访问:
/users/search/findByAddress_City?city=Beijing
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.address.city = :city")
List<User> findByCity(@Param("city") String city);
}
访问URL:
/users/search/findByCity?city=Shanghai
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
// 不需要额外方法
}
然后可以通过POST请求发送Specification:
POST /users/search/findAll
Content-Type: application/json
{
"spec": {
"address.city": "Guangzhou"
}
}
原因:实体类关系映射不正确或Repository方法命名不规范
解决方案:
@Entity
public class User {
@Id
private Long id;
@Embedded
private Address address;
// getters and setters
}
@Embeddable
public class Address {
private String city;
private String street;
// getters and setters
}
原因:可能由于延迟加载或关联关系配置不当
解决方案:
@NamedEntityGraph
:@Entity
@NamedEntityGraph(name = "User.withAddress",
attributeNodes = @NamedAttributeNode("address"))
public class User {
// ...
}
@EntityGraph
:@EntityGraph(value = "User.withAddress")
List<User> findByAddress_City(String city);
解决方案:
Page<User> findByAddress_City(String city, Pageable pageable);
访问URL:
/users/search/findByAddress_City?city=Beijing&page=0&size=10&sort=name,asc
通过以上方法和技巧,可以充分利用Spring Data REST 2.6.10提供的功能,实现按嵌入属性值的灵活查询。
没有搜到相关的文章