• SpringData JPA使用JPQL的方式查询和使用SQL语句查询


    使用Spring Data JPA提供的查询方法已经可以解决大部分的应用场景,但是对于某些业务来说,我们还需要灵活的构造查询条件,

    这时就可以使用@Query注解,结合JPQL的语句方式完成查询

    持久层接口:

    /**
     * 客户持久层接口
     * JpaRepository<实体类类型,主键类型>:用来完成基本CRUD操作
     * JpaSpecificationExecutor<实体类类型>:用于复杂查询(分页等查询操作)
     */
    public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
    
        /**
         * 根据客户名称查询客户
         * 使用jpql的形式查询
         *  jpql:from Customer where custName = ?
         *  配置jpql语句,使用的@Query注解
         */
        @Query("from Customer where custName = ?")
        Customer findJpql(String custName);
    
        /**
         * 根据客户名称和客户id查询客户
         * jpql: from Customer where custName = ? and custId = ?
         *  对于多个占位符参数
         *      赋值的时候,默认的情况下,占位符的位置需要和方法参数中的位置保持一致
         *      也可以指定占位符参数的位置
         *          ?索引的方式,指定此占位的取值来源
         */
        @Query("from Customer where custName = ?2 and custId = ?1")
        Customer findCustNameAndId(Long id, String name);
    
        /**
         * 使用jpql完成更新操作
         * 根据id更新,客户的名称
         * sql  :update cst_customer set cust_name = ? where cust_id = ?
         * pql : update Customer set custName = ? where custId = ?
         *  @Query : 代表的是进行查询
         *  @Modifying : 声明此方法是用来进行更新操作
         */
        @Query(value = "update Customer set custName = ? where custId = ?")
        @Modifying
        @Transactional // springdata jpa使用jpql执行插入,更新,删除需要手动提交事务
        @Rollback(false) // 默认在执行之后,回滚事务,这里设置不回滚
        void updateCustomer(String custName, long custId);
    
    
        /**
         * 使用sql的形式查询:查询全部的客户
         *      sql:select * from cst_customer
         *      nativeQuery : true 使用本地sql的方式查询 false(默认) jpql查询
         */
        @Query(value = "select * from cst_customer", nativeQuery = true)
        List<Customer> findSql();
    }

    测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext.xml")
    public class JpqlTest {
        @Autowired
        private CustomerDao customerDao;
    
        @Test
        public void testFindJpql() {
            Customer c = customerDao.findJpql("小明");
            System.out.println(c);
        }
    
        @Test
        public void testFindCustNameAndId() {
            Customer c = customerDao.findCustNameAndId(6L, "小倩");
            System.out.println(c);
        }
    
        @Test
        public void testUpdateCustomer() {
            customerDao.updateCustomer("lily", 4L);
        }
    
        @Test
        public void testFindSql() {
            List<Customer> customers = customerDao.findSql();
            for (Customer customer : customers) {
                System.out.println(customer);
            }
        }
    }
  • 相关阅读:
    centos7修改服务端口(ssh为例)
    VLAN基础知识
    三层交换机与路由器区别
    冲突域和广播域的区分
    LAN口和WAN口的区别是什么?
    内网穿透frp
    linux bash中too many arguments问题的解决方法
    linux日志
    linux服务管理
    OSPF 多区域配置实验
  • 原文地址:https://www.cnblogs.com/roadlandscape/p/12374879.html
Copyright © 2020-2023  润新知