gpt4 book ai didi

java - JPA - 如何使用规范和@EmbeddedId进行查询?

转载 作者:行者123 更新时间:2023-12-01 16:47:21 25 4
gpt4 key购买 nike

我正在使用 JPA 查询,该查询使用规范来检索实体。当我执行查询时,出现错误:

org.springframework.data.mapping.PropertyReferenceException: No property name found for type Task!

我查看了之前在此网站上提出的类似问题的答案,并尝试对我的代码进行建模以遵循推荐的模式,但代码仍然失败。

当我使用调试器单步执行代码时,条件生成器中的扩展路径返回嵌入的 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);
}

** 编辑按照下面的建议向存储库添加了方法 **

最佳答案

'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");

演示应用程序 link .

关于java - JPA - 如何使用规范和@EmbeddedId进行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com