MySQL JPA- 非实体类中连接两个表
在数据库中,我们通常会出现需要同时查询两个不同表的数据的情况。在JPA中,我们可以使用Join查询语句来实现这个功能,但我们会发现很多情况下需要将结果以非实体类形式返回,比如说涉及到多表查询的报表,这时候我们需要将结果转换为普通Java类对象。本文将教你如何使用JPA完成多表查询并返回结果给非实体类。
阅读更多:MySQL 教程
准备工作
在开始之前,我们先来创建两个表,一个是用户表,另一个是订单表。创建表的DDL如下:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`price` float(6,2) DEFAULT NULL,
PRIMARY KEY (`id`)
);
然后,我们创建两个实体类User和Order,代码如下:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
// getters & setters
}
@Entity
@Table(name = "order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long userId;
private Double price;
// getters & setters
}
同时,我们创建一个用来返回多表查询结果的非实体类UserOrder,代码如下:
public class UserOrder {
private String userName;
private Double orderPrice;
// getters & setters
}
实现多表查询
我们先介绍一下JPA中的Join查询语句,Join查询可以将两个或多个表的结果合并在一起以进行查询。在JPA中,我们可以使用JOIN和LEFT JOIN关键字来完成Join查询。
下面的查询语句查询User和Order两个表的数据,并将结果封装到UserOrder对象中返回:
String sql = "SELECT u.name, o.price FROM user u JOIN order o ON u.id = o.user_id WHERE u.id = ?1";
Query query = entityManager.createNativeQuery(sql);
query.setParameter(1, userId);
List<Object[]> objects = (List<Object[]>)query.getResultList();
List<UserOrder> userOrders = new ArrayList<>();
for (Object[] object : objects) {
UserOrder userOrder = new UserOrder();
userOrder.setUserName((String) object[0]);
userOrder.setOrderPrice((Double) object[1]);
userOrders.add(userOrder);
}
在这个查询语句中,我们使用了JOIN关键字,将User表和Order表通过主键id和外键user_id进行Join查询。在查询语句中,我们使用了占位符?1来表示后面的参数userId,并将其传入setParameter()方法中。
JPA中执行Native SQL有两种方式:
- 直接在
EntityManager上执行SQL,返回一个List<Object[]>类型的结果集。 -
使用
@SqlResultSetMapping注解将结果映射到一个@Entity类中,然后使用EntityManager上的createNativeQuery()方法执行SQL,并通过setResultClass()方法指定映射的类。
上述查询语句使用了第一种方式,因为我们需要返回的结果并不是实体类,而是非实体类UserOrder对象。
总结
本文介绍了如何使用JPA执行多表查询并将结果以非实体类形式返回。我们提到了Join查询语句的使用方法,并演示了如何将结果封装到一个非实体类对象中。希望这篇文章能够对正在学习JPA多表查询的读者有所帮助!在实际开发中,多表查询是非常常见的操作,了解JPA的多表查询语法和结果封装方式是非常有帮助的。
极客教程