Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate,按组合键的属性查询_Hibernate_Criteria - Fatal编程技术网

Hibernate,按组合键的属性查询

Hibernate,按组合键的属性查询,hibernate,criteria,Hibernate,Criteria,以下是我的实体,不带nessceary 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(Mai

以下是我的实体,不带nessceary 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.aproperty 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;
}
==类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;
    }

}

谢谢

标准API仍然不直接支持嵌套属性。您需要创建
别名
来创建嵌套属性的
条件
。下面的代码应该适合您

 session.createCriteria(Main.class)
 .createAlias("pk.a", "a_alias")
 .add( Restrictions.eqProperty("a_alias.aProperty", "foo")) // .add( Restrictions.eq("a_alias.aProperty", "foo"))
 .list();
不鼓励在复杂情况下使用
标准
。在可能的情况下,尝试在动态生成的查询上使用静态查询。这将使您能够控制查询,以便在可能的情况下对其进行维护和优化


干杯,快乐编码

我得到了这个异常:org.hibernate.QueryException:Criteria对象不能直接在组件上创建。创建所属实体的条件,并使用虚线属性访问组件属性:pk。顺便问一下,静态查询是什么意思?我不擅长英语。你能给我举个例子吗。谢谢大家!@Sazzadarrahaman是否有相应属性的getter setter?因为我看不出这个问题的任何其他原因!在这一行
session.createCtitera(Main.class)
之后不要放
。只需将您的代码部分替换为上面的代码部分,然后重试。请参阅我的问题中的==更新==部分。我想粘贴所有相关的代码。但似乎有太多的信我不能寄了。所以我只加了一些。异常堆栈只是主公园。我认为其他堆栈没有用。而且,getter和getter肯定是提供的。你能编辑帖子吗?显示域及其hibernate映射,请!您可以像下面的答案一样编辑,这应该是有效的!
 session.createCriteria(Main.class)
 .createAlias("pk.a", "a_alias")
 .add( Restrictions.eqProperty("a_alias.aProperty", "foo")) // .add( Restrictions.eq("a_alias.aProperty", "foo"))
 .list();