2

これは次のものと似ていますが、同一ではありません。

さまざまなオブジェクトのさまざまなプロパティに対する Hibernate 基準クエリ

ResponsibleIndividuals のセットを持つ SpecChange レコードがあります。これらは、休止状態の結合テーブルの関連付けによってマップされたユーザー レコードです。ResponsibleIndividuals セットに指定された User を持つ SpecChange の基準クエリ、または SpecChange の他の条件を作成したいと考えています。

わかりやすくするためにほとんどのコードを省略し、関連する注釈のみを示しています。

@Entity
class SpecChange {
 @OneToMany
 @JoinTable(name = "ri_id_spec_change_id", joinColumns = { @JoinColumn(name = "spec_change_id") }, inverseJoinColumns = @JoinColumn(name = "ri_id"))
 @AccessType("field")
 public SortedSet<User> getResponsibleIndividuals() { ... }

 @Id
 @Column(name = "unique_id")
 @AccessType("field")
 public String getId() { ... }
}

@Entity
class User { ... }
//user does not have a SpecChange association (the association is one-way)

私がしたいこと:

User currentUser = ...;
Criteria criteria = session.createCriteria(SpecChange.class);
...
criteria.add(Restrictions.disjunction()
 .add(Restrictions.eq("responsibleIndividuals", currentUser))
 .add(...)
);
criteria.list();

これにより、間違った SQL が生成されます。

select ... from MY_DB.dbo.spec_change this_ ... where ... (this_.unique_id=?)

...そして失敗します:

java.sql.SQLException: Parameter #2 has not been set.

(where 句で別の条件を省略したため、パラメーター #2 が表示されます。'currentUser' が null ではないことは確かです。)

この制限は間違ったテーブルを参照していることに注意してください: this_ は SpecChange であり、User テーブルではありません。

正しく機能させるために、さまざまなトリックを試しました (上記の前の投稿で述べたように、エイリアスの作成を含む)。エイリアスを使用してそれを行う方法がある場合、私はそれを特定できませんでした。

次の DOES は機能します (ただし、選言で使用できないため、必要なことは達成されません)。

[編集: HQL を使用した、Hibernate のバグのように見えるものの回避策]

select sc 
from com.mycompany.SpecChange sc
left join fetch sc.responsibleIndividuals as scResponsibleIndividuals
where scResponsibleIndividuals = :p1 or sc.updUser = :p1
order by sc.updDate desc

これはエイリアス「scResponsibleIndividuals」なしでは機能しません

4

0 に答える 0