3

UserDetailshasmanyFiledTaskTaskhasManyの関係を持つ 3 つのエンティティがありFiledTaskます。私が欲しいのはFiledTask特定のリストですUser

UserDetails の場合:

@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

OK、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 に答える
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。インスタンスは、複数のタスクではなく、1 つのタスクを表します。

于 2012-12-16T15:10:51.990 に答える
0

MySQL5InnoDBDialectMySql (Inno) DB と、Hibernate の- クラスから派生した方言クラスを使用して、同じ問題が発生しました。

をオーバーライドしてsupportsRowValueConstructorSyntax-methodfalseMySQLDialect (MySQL5InnoDBDialect の基本クラス) が返すようにする必要がありtrueました。

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

.userこれを行うと、比較用のタプルを作成するために、休止状態はオブジェクト参照(あなたの場合)を使用しません。これが役立つことを願っています。

于 2015-01-23T16:44:06.010 に答える