簡體   English   中英

JPA - 如何使用規范和@EmbeddedId 進行查詢?

[英]JPA - How to query using Specification and @EmbeddedId?

我正在使用使用規范來檢索實體的 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);    
}

**編輯向存儲庫添加的方法,如下所示 **

啊,根本原因完全在我們的代碼庫中。 頁面上指定的排序順序不包含嵌入的“id”屬性。 上面的代碼有效。

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

演示應用程序鏈接

看看這個鏈接,它有一個類似的查詢。

嵌入式 ID 查找

最終答案表明您可以因此向您的 TaskRepository 添加一個方法。

public interface TaskRepository extends JpaRepository<Task, TaskId>, JpaSpecificationExecutor<Task> {
   public List<Task> findByIdName(String name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM