我有一个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!"
}
看来我用错了这个查询?
尝试
Page<Device> findByUser_Id(@Param("user") User user, Pageable pageable);
由于您正在DeviceRepository中创建一个方法,并且您希望在嵌套的文件(user.id)上进行搜索,因此您需要使用_引用它
请看一下这些文件。
属性表达式只能引用托管实体的直接属性,如前一示例所示。在查询创建时,您已经确保解析的属性是托管域类的属性。但是,也可以通过遍历嵌套特性来定义约束。假设一个人有一个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中获取它,那么方法是什么样子的?我假设它看起来会像下面这样(当然不起作用)。