3

我有三个关系UserDetailshasmanyFiledTaskTaskhasMany的实体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]
4

3 回答 3

5

如果您想要给定用户的 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。一个实例代表一个任务,而不是多个任务。

于 2012-12-16T15:10:51.990 回答
5

好的,看起来 Hibernate 中存在错误

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); 

希望这可以帮助某人。我花了几个小时在这上面。

于 2013-08-27T13:00:36.317 回答
0

我在使用 MySql (Inno) DB 以及从 Hibernate 的MySQL5InnoDBDialect- 类派生的方言类时遇到了同样的问题。

我必须覆盖supportsRowValueConstructorSyntax-method并让它返回false为 MySQLDialect(它是 MySQL5InnoDBDialect 的基类)返回true

@Override
public boolean supportsRowValueConstructorSyntax() {
    return false;
}

这样做,hibernate 不使用对象引用(在您的情况下.user)来创建一个元组进行比较。我希望这个能帮上忙。

于 2015-01-23T16:44:06.010 回答