5

我正在使用使用规范检索实体的 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将方法添加到存储库,如下所示**

4

3 回答 3

4

啊,根本原因完全在我们的代码库中。页面上指定的排序顺序不包含嵌入的“id”属性。上面的代码有效。

于 2017-12-19T18:20:05.483 回答
4

'root.get({embeddedIdName}).get({subPropertyName})' 用于使用规范查询 embeddedId。

@Embeddable
public class ProjectId implements Serializable{

    private static final long serialVersionUID = 1L;

    @Column(name = "PROJECT_NAME")
    private String projectName;

    @Column(name = "ORGANIZATION")
    private String organization;

    ......
    ......

}


@Entity
@Table(name = "projects")
public class Project {

    @EmbeddedId
    private ProjectId projectId;

    @Column(name = "STARTED_TIME")
    private Timestamp startedTime;

    @Column(name = "ACTIVE")
    private String active;

    @Column(name = "DESCRIPTION")
    private String description;

    ......
    ......
}

在上面的代码片段中,ProjectId 是一个嵌入的 id。要查询 projectName,我们应该使用以下代码段。

expression = root.get("projectId").get("projectName");

演示应用链接

于 2020-03-26T06:49:52.317 回答
3

看看这个有类似查询的链接。

EmbededId 查找

最终答案表明您可以向 TaskRepository 添加一个方法。

public interface TaskRepository extends JpaRepository<Task, TaskId>, JpaSpecificationExecutor<Task> {
   public List<Task> findByIdName(String name);
}
于 2017-12-19T14:27:42.547 回答