JPA 使用过程中突然连接异常问题处理记录

broken because of SQLSTATE(08S01), ErrorCode(0)

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet successfully received from the server was 5,078,468 milliseconds ago. The last packet sent successfully to the server was 5,078,479 milliseconds ago.

在这里插入图片描述

程序用一段时间就挂掉了,一开始以为是配置的问题,后来发现自己在使用 EntityManager 这个类出的问题

在这里插入图片描述

将@Resoure 改成 @PersistenceContext 注解
在这里插入图片描述

代码就可以持续跑动

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解您的问题了。以下是一个使用 JPA 2.2.10 的 entityManager 构建 SQL 查询返回 DTO 的示例,同时涉及了实体类和 DTO 都有 set<实体类>,leftjoin 和 Concat group: 首先,假设有两个实体类 User 和 Order,其 User 有一个 Set<Order> 属性,如下所示: ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @OneToMany(mappedBy = "user") private Set<Order> orders = new HashSet<>(); // getter 和 setter 省略 } ``` ```java @Entity @Table(name = "order") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "user_id") private User user; // getter 和 setter 省略 } ``` 然后,我们需要一个 DTO,用来存储查询结果: ```java public class UserOrderDto { private Long userId; private String userName; private String concatenatedOrderIds; // getter 和 setter 省略 } ``` 现在,我们可以使用 JPA 的 Native Query 和 EntityManager 来构建 SQL 查询,返回 UserOrderDto 对象: ```java String query = "SELECT u.id AS userId, u.name AS userName, " + "GROUP_CONCAT(o.id SEPARATOR ', ') AS concatenatedOrderIds " + "FROM user u LEFT JOIN order o ON u.id = o.user_id " + "GROUP BY u.id"; Query nativeQuery = entityManager.createNativeQuery(query, "UserOrderDtoMapping"); List<UserOrderDto> results = nativeQuery.getResultList(); ``` 在上面的 code snippet ,我们使用 LEFT JOIN,连接 User 和 Order 表,然后使用 GROUP_CONCAT 将多个 Order 记录的 id 连接为一个字符串。注意,GROUP_CONCAT 是 MySQL 特有的函数,如果使用其他数据库,可能需要使用不同的函数来实现相同的功能。 此外,我们还需要为 UserOrderDto 创建一个 Mapping,以告诉 JPA 如何将查询结果映射到 DTO 对象: ```java @Entity @SqlResultSetMapping( name = "UserOrderDtoMapping", classes = @ConstructorResult( targetClass = UserOrderDto.class, columns = { @ColumnResult(name = "userId", type = Long.class), @ColumnResult(name = "userName", type = String.class), @ColumnResult(name = "concatenatedOrderIds", type = String.class) } ) ) public class UserOrderDtoMapping { } ``` 最后,我们可以将查询结果转换为 UserOrderDto 实例: ```java for (UserOrderDto dto : results) { System.out.println(dto.getUserId() + ", " + dto.getUserName() + ", " + dto.getConcatenatedOrderIds()); } ``` 以上是一个基本的使用 JPA 2.2.10 的 entityManager 构建 SQL 查询返回 DTO 的示例,同时涉及了实体类和 DTO 都有 set<实体类>,leftjoin 和 Concat group。注意,在生产代码,我们需要适当地处理异常和错误情况,并使用更好的命名约定和代码结构来提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值