【问题标题】:Hibernate join without createQuery()没有 createQuery() 的休眠连接
【发布时间】:2016-03-31 09:45:08
【问题描述】:

我怎样才能做到这一点

session
    .createQuery(
        "select person from Pet pet " +
        "inner join pet.person person " +
        "where person.age = 32)
    .list();

通过,而不是使用 HQL,使用 Hibernate 函数,例如 createCriteria()、createAlias()、setProjection() 等?

【问题讨论】:

  • Person 是否与Pet 有关系?
  • 不,我认为这是我的主要问题。没有从 Person -> Pet 的映射,只有 Pet -> Person。
  • 并且查询应该返回所有 32 岁且拥有与其相关的宠物的人?
  • 完全正确,就像给定的 HQL 一样。

标签: java sql hibernate criteria projection


【解决方案1】:

这样的东西应该可以工作

Criteria crit = session.createCriteria(Person.class);
crit.createAlias("pet", "pet");
crit.add(Restrictions.eq("age", 32);
crit.list();

createAlias 仅用于与Pet 进行内连接,如果重点是列出所有 32 岁且有宠物的人。

EDIT 在了解模型和要求之后,试试这个。不漂亮,但它应该可以工作

Criteria c = session.createCriteria(Person.class, "person");
c.add(Restrictions.eq("age", 32));
DetachedCriteria dc = DetachedCriteria.forClass(Pet.class, "pet");
dc.add(Property.forName("pet.person_id").eqProperty("person.id"));
c.add(Subqueries.exists(dc.setProjection(Projections.id())));
List<Person> persons = c.list();

【讨论】:

  • 我认为这行不通,因为 Person 不知道它有一个 Pet,只有 Pet 知道它有一个 Person。
  • 我已经编辑了我的答案,希望这个新代码应该可以工作。
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多