我有三个实体,它们的关系为UserDetails
hasmany FiledTask
和Task
hasMany FiledTask
。我想要的只是特定FiledTask
的User
列表
对于用户详细信息:
@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
。一个实例代表一个任务,而不是多个任务。