我正在使用使用规范检索实体的 JPA 查询。当我执行查询时,我收到错误:
org.springframework.data.mapping.PropertyReferenceException:找不到类型任务的属性名称!
我已经查看了之前在此站点上提出的类似问题的答案,并尝试对我的代码进行建模以遵循推荐的模式,但代码仍然失败。
当我使用调试器单步执行代码时,条件构建器中的扩展路径返回嵌入的 ID 类,但是当查询中实际使用规范时,看起来该属性正在应用于基本实体类。
我错过了一些明显的东西吗?
这是实体类:
@Entity
@Table(name = "TASKS")
public class Task implements Serializable {
@EmbeddedId
private TaskId id;
...more attributes, getters and setters
}
这是嵌入的 ID 实体类:
@Embeddable
public class TaskId implements Serializable {
@Column(name = "NAME", length = 100)
private String name;
...more attributes, getters and setters
}
这是与嵌入的 id 'name' 属性匹配的规范生成器:
public class HasTaskNameSpec {
private HasTaskNameSpec() {
}
public static Specification<Task> equals(String name) {
return (root, query, criteriaBuilder) -> {
return criteriaBuilder.equal(root.get("id").get("name"), taskName);
};
}
}
查询在存储库上执行如下:
List<Task> results = taskRepository.findAll(HasTaskNameSpec.equals("foo"));
存储库本身非常简单:
public interface TaskRepository extends JpaRepository<Task, TaskId>, JpaSpecificationExecutor<Task> {
List<Task> findByIdName(String name);
Page<Task> findByIdName(String name, Pageable page);
}
** EDIT将方法添加到存储库,如下所示**