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

通过嵌套实体查找Spring数据REST

澹台俊晖
2023-03-14

我有一个SpringBoot项目,它使用SpringDataREST生成我的rest接口,我正在尝试允许对嵌套资源进行分页。我遵循了这一解决方法,并陷入了实现findBy查询的困境。

我有以下设备实体:

@Entity
@Table(name = "devices")
public class Device extends ResourceSupport {

  ...

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "user_id")
  private User user;
}

我需要使用userId查询它:

@RequestMapping(path = "/users/{id}/devices", method = RequestMethod.GET)
public ModelAndView getUserDevices(@PathVariable Integer id) {
    return new ModelAndView("forward:/devices/search/findByUserId?userId=" + id);
}

因此,我在DevicePository中创建了以下方法:

@Repository
public interface DeviceRepository extends JpaRepository<Device, Long> {

  @PreAuthorize("hasRole('ROLE_ADMIN') OR @securityCheck.check(#user, authentication)")
  Page<Device> findByUserId(@Param("user") User user, Pageable pageable);

}

但我在尝试向该endpoint发送请求时遇到以下异常

Unable to locate Attribute  with the the given name [id] on this ManagedType [com.example.User]

有人能告诉我我做错了什么吗?

编辑:谢谢你的回复,我把方法改为

Page<Device> findByUser_UserId(@Param("user") User user, Pageable pageable);

我的用户实体包含一个userId字段。

然而,现在我得到了以下例外:

{
    "cause": {
        "cause": {
            "cause": null,
            "message": "Cannot resolve URI 1. Is it local or remote? Only local URIs are resolvable."
        },
        "message": "Failed to convert from type [java.net.URI] to type [@org.springframework.data.repository.query.Param com.example.User] for value '1'; nested exception is java.lang.IllegalArgumentException: Cannot resolve URI 1. Is it local or remote? Only local URIs are resolvable."
    },
    "message": "Failed to convert 1 into me.originalsin.user.model.User!"
}

看来我用错了这个查询?

共有2个答案

公冶元青
2023-03-14

尝试

 Page<Device> findByUser_Id(@Param("user") User user, Pageable pageable);

由于您正在DeviceRepository中创建一个方法,并且您希望在嵌套的文件(user.id)上进行搜索,因此您需要使用_引用它

慕才
2023-03-14

请看一下这些文件。

属性表达式只能引用托管实体的直接属性,如前一示例所示。在查询创建时,您已经确保解析的属性是托管域类的属性。但是,也可以通过遍历嵌套特性来定义约束。假设一个人有一个ZipCode地址。在这种情况下,方法名为

List<Person> findByAddressZipCode(ZipCode zipCode);

[...]虽然这应该适用于大多数情况,但算法可能会选择错误的属性。假设Person类也有一个addressZip属性。该算法在第一轮拆分中已经匹配,基本上选择了错误的属性,最终失败(因为地址类型Zip可能没有代码属性)。要解决这个歧义,您可以在方法名称中使用_来手动定义遍历点。因此,我们的方法名称会以这样的方式结束:

List<Person> findByAddress_ZipCode(ZipCode zipCode);

这意味着:除了设备类有一个字段用户ID之外,您所做的应该可以工作。

您向我们展示的例外情况是原始问题中的以下内容。

无法在此ManagedType[com.example.用户]上找到具有给定名称[id]的属性

这看起来像您的类User没有一个名为id的字段。因为你没有给我们看这个类的代码,我不知道是不是这样。(确保您在存储库中导入了正确的User类)

问题已更新,因此另一个答案存在另一个错误

现在的问题是,您将User对象传递给存储库方法,但按id进行过滤。只需将第一个参数更改为用户id的数据类型。我认为这应该可以。

假设id的类型是int,该方法可能如下所示

Page<Device> findByUser_UserId(@Param("userId") int userId, Pageable pageable);
 类似资料:
  • 我正在尝试查询spring data elasticsearch存储库中的嵌套属性。我的存储库如下所示: 域对象Person和Address(无getter/setter)定义如下: 我的测试保存一个人的文档,并尝试使用repository方法读取它。但没有返回任何结果。以下是测试方法: spring data elasticsearch是否支持默认的spring数据查询生成?

  • 我在Elasticsearch版本1.3.4中有以下查询: 映射如下所示: 最后,对于技能(不包括其他部分),文档结构如下所示: 我使用这个查询的目标是,首先用过滤器过滤掉一些不相关的点击(查询的底部),然后通过搜索整个文档中的match\u短语“java”来给一个人打分,如果它还包含match\u短语“adobe creative suit”,则会额外提高分数,然后检查在“skills”中点击的

  • 在我的遗留应用程序中,我有一个国家表、状态表和一个国家和州的映射表,几乎没有额外的列。 我创建了这样一个实体类。 我的仓库。 我想检查映射表中是否存在状态。以下两种方法都不起作用。 正确的方法是什么?

  • 我正在用Java开发一个使用JPA的路线规划系统。我需要创建一个findBy方法,通过包含它的城市列表来查找路线。以下是课程: 现在我尝试了,但并不惊讶它不起作用,如下所示: 有没有一种简单的方法可以使用JPA,或者我必须编写一个困难的自己的@Query并以某种方式迭代,才能通过集合找到一个实体?

  • 我有一个LOCATION实体,它包含国家、州和城市。并且我有一个LocationRepository接口定义为: 我想按国家找到所有的州。我可以遵循方法名称标准来查询位置实体的所有内容。如果我想要列表,我需要创建StateRepository接口并在其中查询关于状态的一切吗?如果我可以从LocationRepository中获取它,那么方法是什么样子的?我假设它看起来会像下面这样(当然不起作用)。