Критерии гибернации для поля класса полного объединения внутренних сущностей - PullRequest
0 голосов
/ 24 августа 2011

Мой класс модели сущностей

------- A -----------
private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "NameA")
    private String nameA;

    public B getBid() {
        return b;
    }

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

    public String getNameA() {
        return nameA;
    }

    public void setNameA(String nameA) {
        this.nameA = nameA;
    }
    @JoinColumn(name = "BID", referencedColumnName = "ID")
    @ManyToOne(fetch= FetchType.LAZY)
    private B b;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
--------------------------------------------
------------------ B -----------------------

private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "NameB")
    private String nameB;


    public String getNameB() {
        return nameB;
    }

    public void setNameB(String nameB) {
        this.nameB = nameB;
    }


    public Long getId() {
        return id;
    }

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

, и я хочу сделать этот запрос session.createQuery("select a.b from A a").list();

с Criteria API ????

1 Ответ

1 голос
/ 24 августа 2011

Поскольку у вас нет обратной связи, и поскольку критерии не позволяют выбрать другую сущность, а не корневую сущность, вам придется использовать подзапрос, но это уродливо:

DetachedCriteria subquery = DetachedCriteria.forClass(A.class, "a");
subquery.createAlias("a.b", "b2");
subquery.setProjection(Projections.property("b2.id"));

Criteria c = session.createCriteria(B.class, "b1");
c.add(Subqueries.propertyIn("b1.id", subquery));

Если бы у вас были обратные отношения OneToMany от B до A, вам просто нужно было бы сделать

Criteria c = session.createCriteria(B.class, "b1");
c.createAlias("b1.as", "a");

Кстати, эти не динамически построенные запросы лучше выражаются с помощью HQL, чем с API критериев. Если ваш реальный запрос - тот, который вы задали, просто используйте HQL: он более читабелен и мощнее.

...