涉及多个关联的HQL JOIN

Akh*_*esh 3 java hibernate

我有三个关系UserDetailshasmany FiledTaskTaskhasMany的实体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)

JB *_*zet 5

如果你想要给定用户的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)

希望这有助于某人.我花了几个小时这个.