我有三个关系UserDetailshasmany FiledTask和TaskhasMany的实体FiledTask.我想要的只是FiledTask特别的清单User
对于UserDetails:
@OneToMany(mappedBy="user",cascade=CascadeType.ALL)
Collection<FiledTask> filedTasks = new ArrayList<FiledTask>();
Run Code Online (Sandbox Code Playgroud)
对于我的任务
@OneToMany(mappedBy="task")
Collection<FiledTask> filedTasks = new ArrayList<FiledTask>();
Run Code Online (Sandbox Code Playgroud)
和FiledTask看起来像
@ManyToOne
@JoinColumn(nullable = false, name = "taskId")
private Tasks task;
@ManyToOne
@JoinColumn(nullable = false, name = "userId")
private UserDetails user;
Run Code Online (Sandbox Code Playgroud)
我试过了
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
Run Code Online (Sandbox Code Playgroud)
但我得到的错误子句只能引用驱动表中的列,意味着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]
Run Code Online (Sandbox Code Playgroud)
如果你想要给定用户的FiledTasks,那么最简单的事情就是
UserDetails user = session.find(UserDetails.class, userId);
Collection<FiledTask> filesTasks = user.getFiledTasks();
Run Code Online (Sandbox Code Playgroud)
使用HQL,它会
select f from FiledTask f where f.user = :user
Run Code Online (Sandbox Code Playgroud)
如果你想要的实际上是给定用户的任务,那么查询就是这样
select t from Tasks t
inner join t.filedTasks filedTask
where filedTask.user = :user
Run Code Online (Sandbox Code Playgroud)
请注意,实体Tasks应该命名Task.实例表示单个任务,而不是多个任务.
小智 5
好吧,看起来Hibernate中有一个bug
https://hibernate.atlassian.net/browse/HHH-2772
在你的情况下,我认为你需要做的是
query = session.createQuery("from Tasks as tasks inner join tasks.filedTasks as files with files.user.id = :userId");
query.setParameter("userId", user.id);
Run Code Online (Sandbox Code Playgroud)
希望这有助于某人.我花了几个小时这个.
| 归档时间: |
|
| 查看次数: |
2879 次 |
| 最近记录: |