联接获取"Cannot join to attribute of basic type"的休眠问题



我在从sqlite数据库加载具有一对一关系的实体时遇到问题。当我使用普通的CriteriaQuery加载它们时,一切都很好。但我读过一些关于性能的文章,最好将数据来自查询中的两个表连接起来,这样hibernate就不会从中进行2次查询

当我尝试创建Fetch时,我得到了一个BasicPathUsageException: Cannot join to attribute of basic type

这是我用来创建查询的方法:

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;
}
}

这是TaskType类:

@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;
}

这就是Task类,它包含一个任务类型对象:

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

相关内容

最新更新