3

以下是我的实体,没有必要的 Hibernate 注释以便清楚。

class Main
{
    private SomePk pk;
}

class SomePk
{
    private A a;
    private B b;
}

class A
{
    private String aProperty;
}
class B
{
    private String bProperty;
}

我想做一些查询,例如:

session.createCtitera(Main.class);
        .add(Restrictrions.eq("pk.a.aProperty", "foo"))
        .list();

但这会引发异常“无法解析属性:pk.a.aPropery of: Main”。那么如何编写条件查询呢?

=============更新========================

===DAO 方法===

public Set<Main> loadMains()
{
    Session session = sessionFactory.getCurrentSession();
    List list = session.createCriteria(Main.class)
        .createAlias("pk", "p_alias")
        .createAlias("p_alias.a", "a_alias")
        .add(Restrictions.eq("a_alias.aProperty", "j"))
        .list();

    Set<Main> mains = new LinkedHashSet<Main>(list);
    return mains;
}

===类主===

@Entity
@Table(name = "MAIN")
public class Main
{
    private SomePK pk;

    private String name;

    @EmbeddedId
    public SomePK getPk()
    {
        return pk;
    }

    public void setPk(SomePK pk)
    {
        this.pk = pk;
    }

    @Column(name = "NAME")
    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

}

===类SomePK===

// ingnore import and package header 

@Embeddable
public class SomePK implements Serializable
{
    private static final long serialVersionUID = 1L;

    private A a;

    private B b;

    @ManyToOne
    @JoinColumn(name = "A")
    public A getA()
    {
        return a;
    }

    public void setA(A a)
    {
        this.a = a;
    }

    @ManyToOne
    @JoinColumn(name = "B")
    public B getB()
    {
        return b;
    }

    public void setB(B b)
    {
        this.b = b;
    }

}

===A类===

@Entity
@Table(name = "A")
public class A
{
    private String aProperty;

    private long id;

    @Id
    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    @Column(name = "A_PROPERTY")
    public String getaProperty()
    {
        return aProperty;
    }

    public void setaProperty(String aProperty)
    {
        this.aProperty = aProperty;
    }

}

===B类===

@Entity
@Table(name = "B")
public class B
{
    private String bProperty;

    private long id;

    @Id
    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    @Column(name = "B_PROPERTY")
    public String getbProperty()
    {
        return bProperty;
    }

    public void setbProperty(String bProperty)
    {
        this.bProperty = bProperty;
    }

}

谢谢!

4

1 回答 1

3

Criteria API 仍然不直接支持嵌套属性。您需要创建Alias嵌套Criteria属性。以下代码应该适合您!

 session.createCriteria(Main.class)
 .createAlias("pk.a", "a_alias")
 .add( Restrictions.eqProperty("a_alias.aProperty", "foo")) // .add( Restrictions.eq("a_alias.aProperty", "foo"))
 .list();

不鼓励使用,不要Criteria用于复杂的情况。尽可能尝试在这些情况下使用静态查询而不是动态生成的查询。这将使您能够控制查询,以便尽可能地维护和优化它们。

干杯和快乐编码!

于 2013-05-27T03:43:31.633 回答