JPA的复杂查询包括一对多多对一和多对多的查询

1. 多表关联查询和排序

假设我们有两个实体类:CustomerOrder,它们之间是一对多的关系,即一个客户可以有多个订单。我们想要查询某个客户的所有订单,并按订单金额进行降序排序。

@Entity
@Table(name = "customers")
public class Customer {@Idprivate Long id;private String name;@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)private List<Order> orders;// getter和setter方法省略
}@Entity
@Table(name = "orders")
public class Order {@Idprivate Long id;private BigDecimal amount;@ManyToOne@JoinColumn(name = "customer_id")private Customer customer;// getter和setter方法省略
}

通过使用@OneToMany@ManyToOne注解,我们在Customer实体类和Order实体类之间建立了一对多的关系,并指定了关联的外键列。

现在,我们可以执行多表关联查询,并按订单金额进行降序排序。

@Repository
public class OrderRepository {@PersistenceContextprivate EntityManager entityManager;public List<Order> getOrdersByCustomer(Long customerId) {String queryString = "SELECT o FROM Order o WHERE o.customer.id = :customerId ORDER BY o.amount DESC";TypedQuery<Order> query = entityManager.createQuery(queryString, Order.class);query.setParameter("customerId", customerId);return query.getResultList();}
}

在上述代码中,OrderRepository类的getOrdersByCustomer方法执行了一个多表关联查询,并按订单金额进行降序排序。我们使用了JPQL语句来查询Order实体类,同时通过条件表达式o.customer.id = :customerId筛选出特定客户的订单。ORDER BY子句用于指定排序的字段和排序方式。

最后,我们通过调用getResultList方法执行查询,并返回满足条件的订单列表。

2. 复杂查询和关联操作

假设我们有三个实体类:StudentCourseEnrollment,它们之间是多对多的关系,即一个学生可以选择多门课程,一门课程也可以有多个学生选择。我们想要查询选择了某门课程的所有学生,并且能够添加新的学生和课程。

@Entity
@Table(name = "students")
public class Student {@Idprivate Long id;private String name;@ManyToMany@JoinTable(name = "enrollments",joinColumns = @JoinColumn(name = "student_id"),inverseJoinColumns = @JoinColumn(name = "course_id"))private List<Course> courses;// getter和setter方法省略
}@Entity
@Table(name = "courses")
public class Course {@Idprivate Long id;private String name;@ManyToMany(mappedBy = "courses")private List<Student> students;// getter和setter方法省略
}

通过使用@ManyToMany@JoinTable注解,我们在Student实体类和Course实体类之间建立了多对多的关系。JoinTable注解用于指定关联表的名称和关联的外键列。

现在,我们可以执行复杂查询,获取选择了某门课程的所有学生,并且能够添加新的学生和课程。

@Repository
public class StudentRepository {@PersistenceContextprivate EntityManager entityManager;public List<Student> getStudentsByCourse(Long courseId) {String queryString = "SELECT s FROM Student s JOIN s.courses c WHERE c.id = :courseId";TypedQuery<Student> query = entityManager.createQuery(queryString, Student.class);query.setParameter("courseId", courseId);return query.getResultList();}public void addStudentToCourse(Student student, Long courseId) {Course course = entityManager.find(Course.class, courseId);student.getCourses().add(course);entityManager.persist(student);}
}

在上述代码中,StudentRepository类的getStudentsByCourse方法执行了一个复杂查询,获取选择了某门课程的所有学生。我们使用了JPQL语句来查询Student实体类,并通过JOIN语句关联了Course实体类。条件表达式c.id = :courseId用于筛选出选择了特定课程的学生。

另外,StudentRepository类的addStudentToCourse方法用于向特定课程中添加新的学生。我们首先通过entityManager.find方法获取到对应的课程实体对象,然后将学生添加到该课程的学生列表中,并通过entityManager.persist方法将更改持久化到数据库中。

当涉及到JPA复杂查询和多表关系操作时,下面是更多案例,展示了不同的情况和用法:

1. 多对多关联查询和条件过滤

假设我们有两个实体类:ProductCategory,它们之间是多对多的关系,即一个产品可以属于多个分类,一个分类也可以包含多个产品。我们想要查询属于某个特定分类且价格低于某个阈值的所有产品。

@Entity
@Table(name = "products")
public class Product {@Idprivate Long id;private String name;private BigDecimal price;@ManyToMany@JoinTable(name = "product_category",joinColumns = @JoinColumn(name = "product_id"),inverseJoinColumns = @JoinColumn(name = "category_id"))private List<Category> categories;// getter和setter方法省略
}@Entity
@Table(name = "categories")
public class Category {@Idprivate Long id;private String name;@ManyToMany(mappedBy = "categories")private List<Product> products;// getter和setter方法省略
}

通过使用@ManyToMany@JoinTable注解,我们在Product实体类和Category实体类之间建立了多对多的关系。JoinTable注解用于指定关联表的名称和关联的外键列。

现在,我们可以执行多对多关联查询,并通过价格条件进行过滤。

@Repository
public class ProductRepository {@PersistenceContextprivate EntityManager entityManager;public List<Product> getProductsByCategoryAndPrice(Long categoryId, BigDecimal maxPrice) {String queryString = "SELECT p FROM Product p JOIN p.categories c WHERE c.id = :categoryId AND p.price < :maxPrice";TypedQuery<Product> query = entityManager.createQuery(queryString, Product.class);query.setParameter("categoryId", categoryId);query.setParameter("maxPrice", maxPrice);return query.getResultList();}
}

在上述代码中,ProductRepository类的getProductsByCategoryAndPrice方法执行了一个多对多关联查询,并通过价格条件进行过滤。我们使用了JPQL语句来查询Product实体类,并通过JOIN语句关联了Category实体类。条件表达式c.id = :categoryId用于筛选出特定分类的产品,p.price < :maxPrice用于筛选出价格低于指定阈值的产品。

最后,我们通过调用getResultList方法执行查询,并返回满足条件的产品列表。

2. 自定义查询结果和投影

在某些情况下,我们可能只需要获取实体类的部分属性,而不是整个实体类的对象。这时可以使用投影(Projection)来自定义查询结果。

假设我们有一个Customer实体类,包含idnameemail等属性。我们想要查询所有客户的名称和邮箱信息。

@Entity
@Table(name = "customers")
public class Customer {@Idprivate Long id;private String name;private String email;// getter和setter方法省略
}

现在,我们可以执行自定义查询,并只选择名称和邮箱两个属性。

@Repository
public class CustomerRepository {@PersistenceContextprivate EntityManager entityManager;public List<Object[]> getCustomerNameAndEmail() {String queryString = "SELECT c.name, c.email FROM Customer c";TypedQuery<Object[]> query = entityManager.createQuery(queryString, Object[].class);return query.getResultList();}
}

在上述代码中,CustomerRepository类的getCustomerNameAndEmail方法执行了一个自定义查询,并只选择了客户的名称和邮箱属性。我们使用了JPQL语句来查询Customer实体类,并在SELECT子句中指定了要选择的属性。由于返回的结果是一组对象数组,我们将查询结果的类型指定为Object[].class
最后,我们通过调用getResultList方法执行查询,并返回包含名称和邮箱信息的对象数组列表。

注解写SQL

此外,JPA还提供了一些注解,如@Query@Param@Modifying,可以更灵活地执行复杂查询操作。下面是几个示例,展示了如何使用这些注解进行复杂查询。

1. 使用@Query注解执行自定义查询

假设我们有一个名为User的实体类,其中包含idnameemail等属性。我们想要根据用户名进行模糊匹配查询符合条件的用户列表。

@Entity
@Table(name = "users")
public class User {@Idprivate Long id;private String name;private String email;// getter和setter方法省略
}

我们可以在UserRepository接口中使用@Query注解来定义自定义查询。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {@Query("SELECT u FROM User u WHERE u.name LIKE %:keyword%")List<User> findByKeyword(@Param("keyword") String keyword);
}

在上述代码中,我们在UserRepository接口中定义了一个带有@Query注解的方法findByKeyword,该方法执行了一个自定义查询。我们使用JPQL语句在User实体类中进行模糊匹配查询,条件是用户名(name属性)包含给定关键字(keyword参数)。

2. 使用@Query和@Modifying注解执行更新操作

除了查询操作,@Query注解还可以用于执行更新操作,如更新、删除等。我们可以结合使用@Query@Modifying注解来执行这样的操作。

假设我们要删除某个邮箱地址为给定值的用户。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {@Modifying@Query("DELETE FROM User u WHERE u.email = :email")void deleteByEmail(@Param("email") String email);
}

在上述代码中,我们在UserRepository接口中定义了一个带有@Query@Modifying注解的方法deleteByEmail,该方法执行了一个自定义的删除操作。我们使用JPQL语句在User实体类中删除邮箱地址为给定值(email参数)的用户。

需要注意的是,在执行更新操作时,需要添加@Modifying注解以通知JPA这是一个修改操作,并且不返回结果。

3. 使用命名参数和位置参数

在使用@Query注解时,我们可以使用命名参数或位置参数来传递参数值。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {@Query("SELECT u FROM User u WHERE u.name = :name AND u.email = ?1")List<User> findByNameAndEmail(String name, String email);
}

在上述代码中,我们在@Query注解中使用了命名参数:name和位置参数?1。命名参数使用冒号(:)后跟参数名称的方式,而位置参数使用问号(?)后跟参数的索引编号的方式。在方法的参数列表中,按照在查询语句中出现的顺序,依次传入参数值。

使用@Query等注解进行多表数据的查询和操作时,你可以编写自定义的JPQL语句,来表达复杂的关联关系和条件。以下是几个示例,展示了如何使用@Query等注解进行多表查询和操作。

1. 多表关联查询

假设我们有两个实体类:OrderCustomer,它们之间是一对多的关系,即一个客户可以有多个订单。我们想要查询某个客户的所有订单。

@Entity
@Table(name = "orders")
public class Order {@Idprivate Long id;private BigDecimal totalAmount;@ManyToOne@JoinColumn(name = "customer_id")private Customer customer;// getter和setter方法省略
}@Entity
@Table(name = "customers")
public class Customer {@Idprivate Long id;private String name;private String email;// getter和setter方法省略
}

我们可以在OrderRepository接口中使用@Query注解来定义自定义查询。

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {@Query("SELECT o FROM Order o JOIN o.customer c WHERE c.id = :customerId")List<Order> findByCustomerId(@Param("customerId") Long customerId);
}

在上述代码中,我们在OrderRepository接口中定义了一个带有@Query注解的方法findByCustomerId,该方法执行了一个自定义查询。我们使用JPQL语句进行多表关联查询,通过JOIN关键字将Order实体类和Customer实体类关联起来,并使用WHERE子句筛选出特定客户的订单。

2. 多表关联更新操作

除了查询,@Query注解还可以用于执行更新操作。假设我们要将某个客户的所有订单的金额增加10%。

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {@Modifying@Query("UPDATE Order o SET o.totalAmount = o.totalAmount * 1.1 WHERE o.customer.id = :customerId")void increaseAmountByCustomer(@Param("customerId") Long customerId);
}

在上述代码中,我们在OrderRepository接口中定义了一个带有@Query@Modifying注解的方法increaseAmountByCustomer,该方法执行了一个自定义的更新操作。我们使用JPQL语句将特定客户的订单金额增加10%。通过SET子句更新totalAmount属性,并通过WHERE子句筛选出特定客户的订单。
需要注意的是,在执行更新操作时,需要添加@Modifying注解以通知JPA这是一个修改操作,并且不返回结果。

对于上述的Order实体类,如果想要执行CRUD操作(创建、读取、更新、删除),可以使用JPA提供的CrudRepository接口或者JpaRepository接口来定义相关方法。这些接口提供了一组常用的方法,例如savefindByIdfindAlldelete等,可以方便地对实体类进行操作。

下面展示了如何使用JpaRepositoryOrder实体类进行CRUD操作:

简单的CRUD操作

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {// 继承JpaRepository,无需额外定义方法
}

在上述代码中,OrderRepository接口继承了JpaRepository<Order, Long>,其中Order是实体类的类型,Long是实体类的主键类型。通过继承JpaRepository,我们无需额外定义方法,即可直接使用继承的方法来执行CRUD操作。

使用示例:

@Service
public class OrderService {private final OrderRepository orderRepository;public OrderService(OrderRepository orderRepository) {this.orderRepository = orderRepository;}public Order createOrder(Order order) {return orderRepository.save(order);}public Order getOrderById(Long orderId) {return orderRepository.findById(orderId).orElse(null);}public List<Order> getAllOrders() {return orderRepository.findAll();}public Order updateOrder(Order order) {return orderRepository.save(order);}public void deleteOrder(Long orderId) {orderRepository.deleteById(orderId);}
}

在上述代码中,我们创建了一个OrderService服务类,通过构造函数注入OrderRepository对象。在OrderService中,我们使用OrderRepository的方法来执行CRUD操作。例如,createOrder方法使用save方法创建一个新的订单,getOrderById方法使用findById方法根据订单ID获取订单,getAllOrders方法使用findAll方法获取所有订单,updateOrder方法使用save方法更新订单,deleteOrder方法使用deleteById方法删除订单。

通过上述示例,你可以使用JpaRepository提供的方法对Order实体类进行CRUD操作。当然,你也可以根据具体需求自定义查询方法,使用@Query注解等方式执行更复杂的查询和操作。

自定义类封装两个实体类的对象数据

如果我们需要查询两个表并且使用一个新的自定义类来接收查询结果,那么可以使用构造函数表达式或投影查询的方式来实现。
以下是两种方法的示例:

方法一:使用构造函数表达式

假设你有两个实体类 EntityAEntityB,并且你想要使用一个新的自定义类 CustomResult 来接收查询结果。

首先,创建一个包含所需属性的 CustomResult 类:

public class CustomResult {private String propertyA;private String propertyB;public CustomResult(String propertyA, String propertyB) {this.propertyA = propertyA;this.propertyB = propertyB;}// getter 和 setter 方法...
}

然后,在你的 JPA 存储库(Repository)中使用构造函数表达式进行查询:

@Repository
public interface MyRepository extends JpaRepository<EntityA, Long> {@Query("SELECT new com.example.CustomResult(a.propertyA, b.propertyB) FROM EntityA a LEFT JOIN a.entityB b")List<CustomResult> findByCustomQuery();
}

在上面的示例中,我们使用构造函数表达式 new com.example.CustomResult(a.propertyA, b.propertyB) 来创建 CustomResult 对象,并将查询结果映射到自定义类中。我们使用了左连接 LEFT JOIN 将两个表进行连接。

当你调用 findByCustomQuery() 方法时,JPA 将执行查询并将结果封装到 CustomResult 对象中。

方法二:使用投影查询

另一种方法是使用投影查询,它允许你选择需要的属性,并将它们映射到一个接口或类的字段中。

首先,创建一个包含所需属性的接口 CustomResult

public interface CustomResult {String getPropertyA();String getPropertyB();
}

然后,在你的 JPA 存储库(Repository)中使用投影查询:

@Repository
public interface MyRepository extends JpaRepository<EntityA, Long> {@Query("SELECT a.propertyA AS propertyA, b.propertyB AS propertyB FROM EntityA a LEFT JOIN a.entityB b")List<CustomResult> findByCustomQuery();
}

在上面的示例中,我们使用投影查询将两个表的属性映射到接口 CustomResult 中的字段。我们使用了左连接 LEFT JOIN 将两个表进行连接。

当我们调用 findByCustomQuery() 方法时,JPA 将执行查询并将结果封装到 CustomResult 接口的实现类中。

这两种方法都可以用于查询两个表并使用一个新的自定义类来接收查询结果。可以根据实际需求选择其中一种方法来实现。

更接近底层的一种写法

在JPA中,你可以使用createNativeQuery()方法执行原生SQL查询,并使用getResultList()方法将查询结果以List<Object[]>的形式返回。每个Object[]表示一行记录,其中每个元素对应于一个查询结果列的值。

以下是一个示例,展示如何使用JPA执行原生SQL查询并使用Map接收查询结果:

@Repository
public class MyRepository {@PersistenceContextprivate EntityManager entityManager;public List<Object[]> executeNativeQuery(String sql) {Query query = entityManager.createNativeQuery(sql);List<Object[]> resultList = query.getResultList();//        List<Map<String, Object>> resultMapList = new ArrayList<>();
//        for (Object[] result : resultList) {
//            System.out.println(Arrays.toString(result));
//            Map<String, Object> resultMap = new HashMap<>();
//            for (int i = 0; i < result.length; i++) {
//                String columnName = ""+i;
//                resultMap.put(columnName, result[i]);
//            }
//            resultMapList.add(resultMap);
//        }//[1, 123456, aaaaaa]//[2, 123456, kingdol] 拿到的结果是只有值,name要自己封装return resultList;}public int executeNativeUpdate(String sql) {Query query = entityManager.createNativeQuery(sql);return query.executeUpdate();}
}

在上面的示例中,我们使用EntityManagercreateNativeQuery()方法创建一个原生SQL查询对象。然后,我们使用getResultList()方法执行查询并将结果以List<Object[]>的形式返回。

接下来,我们遍历结果列表,将每行记录转换为一个Map<String, Object>对象。对于每行记录,我们遍历查询结果的每个元素,并使用Query对象的getResultList()方法获取对应的列名。然后,我们将列名作为键,查询结果值作为值,将它们存储到Map中。最后,我们将每个Map对象添加到一个List<Map<String, Object>>中,并将其作为查询结果返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Web项目中 JSP 访问问题

一、名词说明&#xff1a; 1、JSP 文件一般有两个存放位置 &#xff08;1&#xff09;webapp 的 WEB-INF目录中 &#xff08;2&#xff09;webapp 目录中 其中 存放在 WEB-INF 被成为 安全目录 安全目录&#xff1a;就是客户端无法访问&#xff0c;只有服务端可以访问的…

day01

文章目录 创建Vue实例插值表达式响应式数据常见标签v-htmlv-show v-ifv-if v-else-if v-elsev-onv-bindv-forv-model 综合案例 创建Vue实例 <!--创建Vue实例&#xff0c;初始化渲染1. 准备容器2. 引包&#xff08;官网&#xff09; — 开发版本/生产版本3. 创建Vue实例 ne…

Maven《一》-- 一文带你快速了解Maven

目录 &#x1f436;1.1 为什么使用Maven 1. Mavan是一个依赖管理工具 ①jar包的规模 ②jar包的来源问题 ③jar包的导入问题 ④jar包之间的依赖 2. Mavan是一个构建工具 ①你没有注意过的构建 ②脱离IDE环境仍需构建 3. 结论 &#x1f436;1.2 什么是Maven &#x…

感知机(二分类模型)

目录 1.感知机计算预测值&#xff1a;2.感知机训练&#xff1a;3.损失函数&#xff1a;4.多层感知机&#xff1a;5.单隐藏层的多层感知机代码实现&#xff1a; 1.感知机计算预测值&#xff1a; 训练结果只有1、-1&#xff0c;故正负相同训练正确&#xff0c;正负相反即训练错误…

【DB】MySQL版本5.7和8的区别,以及升级的注意事项

文章目录 1、MySQL版本5.7和8的区别2、MySQL 5.7升级8 1、MySQL版本5.7和8的区别 在数据库管理系统中&#xff0c;MySQL是一个广泛使用、开源的解决方案。它提供了强大的功能&#xff0c;同时具有优秀的性能和可扩展性。 MySQL 5的发布于2005年&#xff0c;在MySQL数据库的发…

实体企业品牌推广之困与解:迅腾文化如何助力企业“显”化品牌价值

在数字化浪潮的冲击下&#xff0c;许多实体企业面临着品牌推广的困境。由于缺乏系统的经验和网络资源的积累&#xff0c;这些企业在品牌推广过程中有很大提升空间。如何以低成本的方式有效推广品牌&#xff0c;成为了实体企业亟待解决的问题。迅腾文化从策略到设计&#xff0c;…

Linux第26步_在虚拟机中安装stm32wrapper4dbg工具

在Ubuntu下编译TF-A 或者 Uboot时&#xff0c;我们需要用到ST公司提供的stm32wrapper4dbg工具。stm32wrapper4dbg工具的源码下载地址为: GitHub - STMicroelectronics/stm32wrapper4dbg 记得我们在前面已经创建过的目录如下&#xff1a; 1&#xff09;、在根目录下&#xf…

Windows项目部署流程

一、部署前需要的工作 ①配置环境变量&#xff1a;将所需的软件和工具的安装路径添加到系统的环境变量中&#xff0c;以便在命令行中可以直接使用。 ②部署项目文件&#xff1a;将项目的文件和代码复制到服务器上的指定目录中&#xff0c;例如Web服务器的网站根目录。 ③配置…

70.网游逆向分析与插件开发-角色数据的获取-自动化助手UI显示角色数据

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;利用技能点属性分析角色数据基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;367aa71f60b…

WIndows系统重装、备份与恢复实操问题笔记

一 windows重装 1.1 基本步骤 下载大白菜根据官网使用教程制作启动u盘从MSDN或者微软官网下载Windows镜像根据查询的快捷键进入BIOS系统&#xff0c;设置U盘为第一启动 重装 1.2 Windows 11 激活 微软其实在2023年9月20日的公告中宣布停掉免费升级&#xff0c;数字激活工具…

Python之循环判断语句

一、if判断语句 1. if...else if 条件: 满足条件时要做的事情1 满足条件时要做的事情2 ...... else: 不满足条件时要做的事情1 不满足条件时要做的事情2 ...... # -*- coding:utf-8 -*- age input("请输入年龄:") age int(age) if age > 18:print("已经成…

一文读懂ERP、OMS、WMS、TMS(2/2)

目录 二、ERP、OMS、WMS、TMS的区别 2.1 ERP (Enterprise Resource Planning) 企业资源计划 2.2 OMS (Order Management System) 订单管理系统 2.3 WMS (Warehouse Management System) 仓库管理系统 2.4 TMS (Transportation Management System) 运输管理系统 二、ERP、OM…

代码随想录算法训练营第十八天|654.最大二叉树 617.合并二叉树.700.二叉搜索树中的搜索

654.最大二叉树 public TreeNode constructMaximumBinaryTree(int[] nums) {return getMaxTree(nums,0,nums.length-1); }public TreeNode getMaxTree(int[] nums, int head, int tail) {if (head > tail) {return null;}int maxIndex getMaxIndex(nums, head, tail);int …

Java8新特性-并行流与串行流

并行流parallel()与串行流(顺序流) sequential() 并行流 就是把 一个内容 分成多个数据块, 并用不同的线程分别处理每个数据块的流 Optional 类 Optional<T> 类 是一个容器类, 代表一个值存在或不村子, 原来用null 表示一个值不存在, 现在Optional类可以更好的表达这个概…

街机模拟游戏逆向工程(HACKROM)教程:[1]数据的存储与读取

简介 在计算机中&#xff0c;数据存储的介质一直在变化&#xff0c;从最早的穿孔纸带&#xff0c;到现在的固态硬盘。但存储的原理是一直没有变化的&#xff0c;在计算机中&#xff0c;我们所存储的数据&#xff0c;一直都是以二进制的形式被存储存在不同的介质中。 计算机用…

(十二)EEPROM的补充

文章目录 EEPROM补充篇读EEPROM补充内容写EEPROM补充内容单字节写入多字节拆成单字节写入现象 EEPROM补充篇 读EEPROM补充内容 对于上一篇博文在读EEPROM的时候&#xff0c;提到的DUMMY WRITE&#xff1a; 这里怎么理解呢&#xff1a; 大家看&#xff0c;写EEPROM的逻辑除了…

诊断服务通讯保持0X3E服务

通信保持0x3E是什么 通信保持0x3E是一种用于确保诊断服务或诊断通讯保持激活状态的机制。它通常用于汽车诊断过程中,通过周期性地发送请求帧来防止定时器发生超时,阻止自动跳转回默认会话状态。这样能够确保诊断服务或者之前激活的通信还处在激活的状态,并保持当前的非默认…

webstorm最新版 激活 成功了

使用webstorm开发工具 很完美&#xff0c;第一次用webstorm IDE 开发工具就完美的激活了&#xff0c;你也不妨试试 链接地址&#xff1a;http://mano100.cn/thread-1942-1-1.html 激活后如下

ABC336 A-E

明天F补完题就加上&#xff08;&#xff09; 放假了又能网瘾漏w 上周的abc太简单了这周的好难&#xff0c;E出了个数位dp想法以为是想复杂了结果还真是... Tasks - AtCoder Beginner Contest 336 A - Long Loong 题意&#xff1a; 输出龙的拼音&#xff0c;把o换成连续的…

Scratch优秀作品飞翔小鸟

程序说明&#xff1a;在无尽的划痕堆中飞驰而过随着你越来越多地飞进迷宫般的街区&#xff0c;平台变得越来越难。 演示视频 scratch飞翔小鸟 其实这就是一个类似像素小鸟的程序&#xff0c;只不过水管角色就地取材&#xff0c;使用scratch里面的积木图片拼成了水管&#xff0…