【问题标题】:How to find entity using JPA(Hibernate) with condition on joined tables?如何使用 JPA(Hibernate) 在连接表上查找具有条件的实体?
【发布时间】:2013-09-03 04:17:21
【问题描述】:

我有 3 个表,每个表都映射到一个实体。实体是这样的:

@Entity
@Table(name = "person")
public class Person implements Serializable {
    private int id;
    //other fields
}

@Entity
@Table(name = "phone")
public class Phone implements Serializable {
    private int id;
    private Long price;

    @ManyToOne
    @JoinColumn(name = "personId")
    private Person person;

    @ManyToOne
    @JoinColumn(name = "manufacturerId")
    private Manufacturer manufacturer;
    //other fields
}

@Entity
@Table(name = "manufacturer")
public class Manufacturer implements Serializable {
    private int id;
    private String name;
    //other fields
}

我想要做的是创建一个方法,该方法将返回具有指定制造商的电话且价格在指定范围内的人员列表。

编辑:我的 dao 类实现了 EntityJpaDao 。我需要一个可以与此实现一起使用的解决方案。

【问题讨论】:

  • 您需要 SQL 解决方案吗?高质量的?标准?这是一个类似于您的问题的示例stackoverflow.com/questions/4483576/…
  • 我是 java 持久性的新手,所以,基本上,我没有一个可行的解决方案 :)。我不确定哪个更好或适用于我的情况。

标签: java sql hibernate jpa criteria-api


【解决方案1】:

以下查询将返回三星手机用户的手机价格范围。

  Criteria criteria = session.createCriteria(Phone.class, "phone"); 
  criteria.createAlias("phone.person", "person")
  criteria.add(Restrictions.between("phone.price", minPrice, maxPrice));
  criteria.createAlias("phone.manufacturer","manufacturer");
  criteria.add(Restrictions.eq("manufacturer.name", Samsung)); 
  criteria.setProjection(Projections.property("person"));

  List<Person> persons = criteria.list();

【讨论】:

  • 我正在使用 JPA 和 entityManager。有没有办法通过这个实现调用 getSession()?
  • entityManager 没有 createCriteria 方法,但我发现我可以使用 entityManager.unwrap(Session.class) 从 entityManager 获取休眠会话。这几乎是完美的,除了我的 Person 没有对电话的引用,只有电话持有对人的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2016-05-05
相关资源
最近更新 更多