如何解决连接获取的休眠问题获取“无法连接到基本类型的属性”
我从sqlite数据库加载具有一对一关系的实体时遇到问题。 当我使用普通的CriteriaQuery加载它们时,一切正常。但是我在某处读过书,为了提高性能,最好将查询中来自数据的两个表连接在一起,这样休眠状态就不会对其中的两个表进行查询。
当我尝试创建Fetch whaty时得到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"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。