在@JoinTable关联上使用Restrictions.disjunction

时间:2010-02-18 01:19:26

标签: java hibernate criteria jointable

这与:

相似但不完全相同

Hibernate criteria query on different properties of different objects

我有一个SpecChange记录,它有一组ResponsibleIndividuals;这些是由hibernate join-table关联映射的用户记录。我想为SpecChange创建一个Criteria查询,该查询在其ResponsibleIndividuals集中具有指定的User,或者在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有效(但是没有达到我的需要,因为我不能在分离中使用它):     criteria.createCriteria( “responsibleIndividuals”)添加(Restrictions.idEq(currentUser.getId()));

[编辑:使用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”

,这将无效

0 个答案:

没有答案