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 に答える