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

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

边永贞
2023-03-14

我正在使用一个JPA查询,它使用一个规范来检索实体。当我执行查询时,我得到了一个错误:

组织。springframework。数据映射。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);    
}

**按照以下建议编辑添加到存储库的方法**

共有3个答案

淳于兴朝
2023-03-14

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

嵌入ID查找

最后的答案建议您可以向TaskRepository添加一个方法。

public interface TaskRepository extends JpaRepository<Task, TaskId>, JpaSpecificationExecutor<Task> {
   public List<Task> findByIdName(String name);
}
汲丰茂
2023-03-14

'根目录。获取({embeddedIdName})。get({subpertyname})”用于使用规范查询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");

演示应用程序链接。

融唯
2023-03-14

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

 类似资料:
  • 我使用spring jpa规范动态构建实体查询。 它工作完美,但是查询返回所有实体字段,这使得性能变慢。我只想获取特定的实体字段,而不是获取我不想要也不会使用的所有实体字段和依赖项。 我在网上搜索,尝试了一些场景,但没有任何不足。有人能就此提出任何解决方案吗? 提前感谢 这是我的。我正在使用spring boot 2.2.4 规格: 存储库: 音乐会服务: ConcertServiceImpl:

  • 我有下面的查询,其中两个表连接在非主列上。该表连接到一个公用列上。 用户详细信息 如何在JPA规范中实现相同的查询

  • 有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式: 试图通过规范执行查询: 我得到了一个错误: 我做错了什么或忘记添加了什么? 查询:按教师姓名显示所有学生 基地实体: 实体教师: 实体学生: 实体教室: 实体教室:

  • 我不能同时使用Spring Data,JPA投影和规范。我有以下设置: 实体: 投影界面: 国家规格: 存储库: 前两个方法findByName和findAllProjectedBy工作良好。而第三个方法findAllProjectedBy(Specification Specification)抛出以下异常- 如何才能做到这一点呢?有什么想法吗?

  • 我正在尝试获取员工的详细信息,其雇员类型是职员,其加入日期是最近的一个。 SQL Server 2008中的查询如下所示: 提前致谢

  • 我有jpa存储库: 和客户规范 通常我是这样取记录的 现在我想按组计算 其中(复杂规范中的标准)按字段1、字段2、字段3分组; 如上所述,如何使用jpaRepository和Custom规范执行此GROUP BY和COUNT 注意:我可以像这样做完整计数 帮助我分组和计数。提前谢谢。