簡體   English   中英

Hibernate 連接提取問題“無法連接到基本類型的屬性”

[英]Hibernate problems with join fetch “Cannot join to attribute of basic type”

我在從 sqlite 數據庫加載具有一對一關系的實體時遇到問題。 當我使用普通的 CriteriaQuery 加載它們時,一切正常。 但是我在某處讀到,為了提高性能,最好將數據來自查詢的兩個表連接起來,這樣 hibernate 就不會從中進行 2 個查詢。

我收到BasicPathUsageException: Cannot join to attribute of basic type當我嘗試創建 Fetch 事物時。

這是我用來創建查詢的方法:

    private List<Task> loadTasks() {
        
        try {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            CriteriaBuilder builder = session.getCriteriaBuilder();
            CriteriaQuery<Task> taskQuery = builder.createQuery(Task.class);
            Root<Task> taskTable = taskQuery.from(Task.class);

            Fetch<Task, TaskType> fetch = taskTable.fetch(TaskType_.ID, JoinType.LEFT);    //<- exception is pointing here
            taskQuery.where(builder.equal(taskTable.get(TaskType_.ID).get("status"), "RECEIVED"));
            
            List<Task> loadedTasks= session.createQuery(taskQuery).getResultList();
            session.getTransaction().commit();
            
            return loadedTasks;
            
        } catch (Exception e) {
            
            e.printStackTrace();
            return null;
        }
    }

這是任務類型 class:

@Entity(name = "TaskType")
@Table(name = "task_types")
public class TaskType implements Serializable {
    
    private final SimpleIntegerProperty id = new SimpleIntegerProperty();
    private final SimpleStringProperty name = new SimpleStringProperty();
    
    @Id
    @Column(name = "task_type_id", unique = true)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId() {
        return id.get();
    }
    
    public void setId(int id) {
        this.id.set(id);
    }
    
    @Column(name = "task_type_name", unique = true)
    public String getName() {
        return name.get();
    }
    
    public void setName(String name) {
        this.name.set(name);
    }
    
    public SimpleIntegerProperty idProperty() {
        return id;
    }
    
    public SimpleStringProperty nameProperty() {
        return name;
    }

這是包含任務類型 object 的任務 class:

@Entity(name = "Task")
@Table(name = "tasks")
public class Task implements Serializable {
    
    private final SimpleIntegerProperty id = new SimpleIntegerProperty();
    private final SimpleStringProperty name = new SimpleStringProperty();
    private TaskType type;
    
    @Id
    @Column(name = "task_id", unique = true)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId() {
        return id.get();
    }
    
    public void setId(int id) {
        this.id.set(id);
    }
    
    @Column(name = "task_name", unique = true)
    public String getName() {
        return name.get();
    }
    
    public void setName(String name) {
        this.name.set(name);
    }
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "task_type_id")
    public TaskType getType() {
        return type;
    }
    
    public void setType(TaskType type) {
        this.type = type;
    }
    
    public SimpleStringProperty nameProperty() {
        return name;
    }
    
    public SimpleIntegerProperty idProperty() {
        return id;
    }

這個 fetch() 應該如何使用,或者我怎樣才能讓代碼加載所有任務,包括它們的任務類型? 我是否使用了錯誤的注釋?

我試圖查找異常,但找不到任何解決方案或了解如何將其應用於我的情況。

謝謝你的幫助!

fetch方法,就像join方法一樣,只對關聯起作用。

您改用以下內容

taskTable.fetch(Task_.TYPE, JoinType.LEFT);
taskQuery.where(builder.equal(taskTable.get(Task_.TYPE).get("status"), "RECEIVED"));

暫無
暫無

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

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