【问题标题】:JPA Entity mapped by SQL Join Query由 SQL 连接查询映射的 JPA 实体
【发布时间】:2016-06-09 08:46:39
【问题描述】:

我想创建一个由 SQL 映射的实体ReportEntry。这里有两张表 - usergroup

mysql> desc user;
+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | int(11)      | NO   | PRI | NULL    | auto_increment |
| firstName              | varchar(255) | YES  |     | NULL    |                |
| lastName               | varchar(255) | YES  |     | NULL    |                |
| active                 | bit(1)       | NO   |     | NULL    |                |
| language               | varchar(20)  | NO   |     | NULL    |                |
| activationDate         | datetime     | YES  |     | NULL    |                |
| group_id               | int(11)      | YES  | MUL | NULL    |                |
|                                                                               |
|                           ...More columns...                                  |
|                                                                               |
+------------------------+--------------+------+-----+---------+----------------+

mysql> desc group;
+----------------------------+--------------+------+-----+---------+----------------+
| Field                      | Type         | Null | Key | Default | Extra          |
+----------------------------+--------------+------+-----+---------+----------------+
| id                         | int(11)      | NO   | PRI | NULL    | auto_increment |
| displayName                | varchar(255) | YES  | MUL | NULL    |                |
| description                | varchar(255) | YES  |     | NULL    |                |
+----------------------------+--------------+------+-----+---------+----------------+

我正在使用以下 SQL 查询在 group_id 上加入这些表。

SELECT u.* FROM user u JOIN group g ON u.group_id = g.id

对于上面的查询,我想创建一个Entity并使用上面的SQL查询作为它的映射。我怎样才能做到这一点?

我不仅想要映射,还想要使用实体来查询记录。例如,假设我能够使用实体 RecordEntry 创建映射,我应该能够以 FROM RecordEntry WHERE id = :id" and I will passid```` 作为参数获取特定记录。这样,最终的查询应该以原生形式执行,就像(对于 id=1)。

SELECT u.* FROM user u JOIN group g ON u.group_id = g.id AND id = 1

【问题讨论】:

标签: java hibernate jpa ejb jpa-2.0


【解决方案1】:

我建议不要将结果映射到 POJO,而是为这两个类创建实体并使用 JPA 提供的一对一注释映射它们:

@Entity
public class User{
  @Id
  private long id;

  @OneToOne
  @JoinColumn(name="GROUP_ID")
  private Group group;
  ...
}


@Entity
public class Group{
  @Id
  private long id;
  ...
}

更新以反映更新后的问题: 然后你可以使用例如Criteria-API(或命名查询),用于查询这些实体:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Root user = criteriaQuery.from(User.class);
criteriaQuery.where(criteriaBuilder.equal(user.get("id"), criteriaBuilder.parameter(Long.class, "id")));
Query query = entityManager.createQuery(criteriaQuery);
query.setParameter("id", id);
User result = (User)query.getSingleResult();

Source: Wikibooks on JPA

【讨论】:

  • 这个解决方案比简单地创建一个“所有字段”POJO 更优雅,因为它反映了用户和他们所属的组之间的正确关联层次结构。同样,所有用户和组属性仍然可以轻松访问。
  • 是的。最后按照您的建议通过映射到两个类。
猜你喜欢
  • 1970-01-01
  • 2019-10-28
  • 2011-06-28
  • 2013-01-22
  • 2023-03-18
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多