繁体   English   中英

通过SQL Join查询映射的JPA实体

[英]JPA Entity mapped by SQL Join Query

我想创建一个由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

对于上面的查询,我想创建一个实体,并使用上面的SQL查询作为其映射。 我该如何实现?

我不仅需要映射,而且还希望使用该实体也能够查询记录。 例如,假设我能够使用实体RecordEntry创建映射,我应该能够通过FROM RecordEntry WHERE id = :id" and I will pass这样的查询来获取特定记录, FROM RecordEntry WHERE id = :id" and I will pass id``作为参数FROM RecordEntry WHERE id = :id" and I will pass 。最终查询应以本机形式执行的方式将是like(for id = 1)。

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

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

@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();

资料来源:有关JPA的Wikibooks

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM