【问题标题】:Hibernate, query by property of the composite keyHibernate,通过组合键的属性查询
【发布时间】:2013-05-27 03:17:27
【问题描述】:

以下是我的实体,没有必要的 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;
    }

}

===Class 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;
    }

}

谢谢!

【问题讨论】:

  • 你编辑喜欢下面的答案,这应该工作!

标签: hibernate criteria


【解决方案1】:

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。尽可能尝试在这些情况下使用静态查询而不是动态生成的查询。这将使您能够控制查询,以便尽可能维护和优化它们。

干杯,编码快乐!

【讨论】:

  • 我得到了这个异常:org.hibernate.QueryException: Criteria objects cannot be created directly on components。创建拥有实体的条件并使用点属性访问组件属性: pk 。顺便问一下,静态查询是什么意思?我英语不好。能给我举个例子。谢谢!@SazzadurRahaman
  • 你有对应属性的getter setter吗?因为我没有看到导致该问题的任何其他原因!
  • 在这行session.createCtitera(Main.class)之后不要放;。只需将您的代码部分替换为上述代码部分,然后重试。
  • 请在我的问题中查看 == 更新 ==。我想粘贴所有相关代码。不过好像信太多了,发不出去。所以我只是添加一些。异常堆栈只是主要的公园。我认为其他堆栈没有用。而且,肯定提供了getter和getter。
  • 您能否编辑显示的帖子,域及其休眠映射!
猜你喜欢
  • 2011-01-28
  • 2012-01-29
  • 2021-12-27
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多