这与:
相似但不完全相同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”
,这将无效