我有三个实体,它们的关系为UserDetails hasmany FiledTaskTask hasMany FiledTask。我想要的只是特定FiledTaskUser列表

对于用户详细信息:

@OneToMany(mappedBy="user",cascade=CascadeType.ALL)
Collection<FiledTask> filedTasks = new ArrayList<FiledTask>();

对于任务我有
@OneToMany(mappedBy="task")
Collection<FiledTask> filedTasks = new ArrayList<FiledTask>();

和FiledTask看起来像
@ManyToOne
@JoinColumn(nullable = false, name = "taskId")
private Tasks task;
@ManyToOne
@JoinColumn(nullable = false, name = "userId")
private UserDetails user;

我努力了
query = session.createQuery("from Tasks as tasks inner join tasks.filedTasks as files with files.user = :user");
query.setParameter("user", user); //user is UserDetails instance

但是我收到了错误子句,它只能引用驱动表中的列,这意味着FiledTask无法使用userId进行比较吗?
with clause can only reference columns in the driving table [from com.akhi.app.cdm.Tasks as tasks inner join tasks.filedTasks as files with files.user = :user]

最佳答案

如果要给定用户的FiledTasks,那么最简单的方法是

UserDetails user = session.find(UserDetails.class, userId);
Collection<FiledTask> filesTasks = user.getFiledTasks();

使用HQL,它将是
select f from FiledTask f where f.user = :user

如果您实际上想要的是给定用户的任务,那么查询将简单地是
select t from Tasks t
inner join t.filedTasks filedTask
where filedTask.user = :user

注意,实体Tasks应该命名为Task。一个实例代表一个任务,而不是多个任务。

09-30 08:57