[英]hibernate.jpa.criteria.BasicPathUsageException: Cannot join to attribute of basic type
[英]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.