美文网首页
2019-10-24Spring Data Jpa @Query

2019-10-24Spring Data Jpa @Query

作者: 卡布奇诺_7828 | 来源:发表于2019-10-24 14:04 被阅读0次
    package cn.itcast.dao;
    
    import cn.itcast.entity.Customer;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
    import org.springframework.data.jpa.repository.Modifying;
    import org.springframework.data.jpa.repository.Query;
    
    import java.util.List;
    
    /*
    * 符合SpringDataJpa的dao层接口规范
    * JpaRepository<操作的实体类泛型,实体类中主键属性的类型>
    *       *封装了基本增删改查操作
    * JpaSpecificationExecutor<操作的实体类类型>
    *       *封装了复杂查询(分页)
    * */
    
    public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
    /*
    * 案例,根据客户名称查询客户
    *        使用jpql的形式查询
    * jpql:from Customer where custName=?
    * 配置jpql语句,使用@Query注解
    * */
        @Query(value="from Customer where custName=?")
        public Customer findJpql(String custName);
    
        /*
        * 案例,根据客户名称和客户id查询用户
        *       jpql:from Customer where custName=? and custId=?
        *  对于多个占位符参数
        *       赋值的时候,默认情况下,占位符的位置需要和方法参数中的位置保持一致
        *可以指定占位符参数的位置
        *       ?索引的方式,指定此占位的取值来源
        *
        * */
        @Query(value = "from Customer where custName=?1 and custId=?2")
        public Customer findCustNameAndId(String name,Long id);
        /*
        * 使用jpql完成更新操作
        *      案例: 根据id更新,客户的名称
        *           更新7号客户的名称,将名称改为“很nb”
        * sql: update cst_customer set cust_name=? where cust_id=?
        * jpql: update Customer set custName=? where custId=?
        *
        * @Query:代表进行查询
        *       *声明此方法是用来更新操作
        * @Modifying
        *   *当前执行的是一个更新的操作
        * */
        @Query(value = "update Customer set custName=?2 where custId=?1")
        @Modifying
        public void updateCustName(long custId,String custName);
    
    
        /**
         *使用sql的形式查询
         *      查询全部用户
         *      sql : select * from cst_customer
         *  @Query:配置sql查询
         *      value:sql语句
         *      nativeQuery:查询方式
         *         true:sql查询
         *         false:jpql查询
         */
    //    @Query(value = "select * from cst_customer",nativeQuery = true)
        @Query(value = "select * from cst_customer where cust_name like ?1",nativeQuery = true)
        public List<Object[]>findSql(String name);
        /**
         * 方法名的约定
         *      findBy:查询
         *          对象中的属性名(首字母大写):查询的条件
         *          CustName
         *          *默认情况  使用  等于的方式查询
         *                  特殊的查询方式
         * findByCustName -- 根据客户名称查询
         * 在springdataJpa的运行阶段
         *      会根据方法名称进行解析  findBy  from xxx(实体类)
         *                          属性名     where custName=
         *
         *      1.findBy+属性名称(根据属性名称进行完成匹配的查询=)
         *      2.findBy+属性名称+查询方式(like|isnull)
         *          findByCustNameLike
         *      3.多条件查询
         *          findBy+属性名+“查询方式”+'多条件的连接符(and|or)'+属性名+“查询方式”
         */
        public  Customer findByCustName(String custName);
    
        public List<Customer> findByCustNameLike(String custName);
        //使用客户名称模糊匹配和客户所属行业精准匹配的查询
        public  Customer findByCustNameLikeAndCustIndustry(String name,String custIndustry);
    }
    
    
    package cn.itcast.test;
    
    import cn.itcast.dao.CustomerDao;
    import cn.itcast.entity.Customer;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.annotation.Rollback;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    @RunWith(SpringJUnit4ClassRunner.class)//声明spring提供的单元测试环境
    @ContextConfiguration(locations = "classpath:applicationContext.xml")//指定spring容器的配置信息
    public class JpqlTest {
    @Autowired
        private CustomerDao customerDao;
    
    @Test
        public void testFindJPQL(){
        Customer jpql = customerDao.findJpql("肇事");
        System.out.println("输出的是:"+jpql);
    }
    
    @Test
        public void testFindCustNameAndId(){
        Customer customer = customerDao.findCustNameAndId("SS1111", 2l);
        System.out.println(customer);
        }
        /*
        * 测试jpql的更新操作
        *   *springDataJpa中使用jpql完成,更新/删除操作
        *       *需要手动添加事务支持
        *       *默认会执行结束之后,回滚事务
        * */
        @Test
        @Transactional//添加事务的支持
        @Rollback(value = false)//设置自动回滚    false|true
        public void testUpdateCustomer(){
        customerDao.updateCustName(7l,"很nb");
        }
        @Test
        public void testFindSql(){
            List<Object[]> sql = customerDao.findSql("%东%");
            for (Object[] objects:sql){
                System.out.println(Arrays.toString(objects));
            }
        }
        /**
         * 测试方法命名规则的查询
         */
    
        @Test
        public void testName(){
            Customer customer = customerDao.findByCustName("刘强东");
            System.out.println(customer);
        }
    
        @Test
        public void testFindByNameLike(){
            List<Customer> list = customerDao.findByCustNameLike("%强%");
            for (Customer customer : list){
                System.out.println(customer);
            }
        }
        @Test
        public void testFindByCustNameLikeAndCustIndustry(){
            Customer customer1 = customerDao.findByCustNameLikeAndCustIndustry("%强%", "教育");
            System.out.println(customer1);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:2019-10-24Spring Data Jpa @Query

          本文链接:https://www.haomeiwen.com/subject/wunrvctx.html