代码之家  ›  专栏  ›  技术社区  ›  RMorrisey

在@JoinTable association上使用Restrictions.disconnection

  •  2
  • RMorrisey  · 技术社区  · 15 年前

    Hibernate criteria query on different properties of different objects

    我有一个SpecChange记录,它有一组负责任的individuals;这些是由hibernate连接表关联映射的用户记录。我想为SpecChange创建一个条件查询,它设置了指定用户的ResponsibleIndividuals,或者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();
    

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

    …但失败了:

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

    (我省略了where子句中的另一个条件,因此参数#2是显示的条件。我确信“currentUser”不为空。)

    请注意,限制引用了错误的表:this\u,这是SpecChange,而不是User表

    我尝试了十几种不同的技巧使其正确工作(包括创建别名,如前一篇文章所述)。如果有使用别名的方法,我无法确定。

    criteria.createCriteria(“responsibleIndividuals”).add(Restrictions.idEq(currentUser.getId());

    [ 编辑

    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 回复  |  直到 7 年前