JPA入门学习(二)

JPA自己封装的方法不够用了可以直接在里面写sql

@Query主要是用于自定义SQL语句。
在自定义的持久层接口(该接口继承JpaRepository接口)方法上打上@Query注解,就可以使用自己定义的SQL语句,此时方法名可以不用遵守Jpa的命名规则。

注意

?后面跟着的数字,表示方法中的第几个参数
需要设置nativeQuery = true,才能使用自己编写的原生SQL语句(没有设置nativeQuery = true,就是默认使用让JPA帮我们自动生成SQL代码查询数据库)

下面就是我写的demo测试

调用

测试

此外@Query里面的占位符和特殊的查询(模糊查询)

测试写的demo
对于JPA来说,like查询是不友好的,可以用CONCAT函数拼接字符串

@Query(value = "select person1.name,person1.id from Person as person1 where person1.id = ?1",nativeQuery = true)
    List<Object> findOneByUsername(Long id);
    @Query(value = "select u.name,u.id,u.age from Person as u where u.name = ?1",nativeQuery = true)
    List<Object> findOneByUsername1(String name);
    @Query(value = "select * from Person p where p.id=?1 and p.name like CONCAT('%',?2,'%')",nativeQuery = true)
    List<Object> findByIdLessThanAndNameLike(Long id,String name);
    @Query(value = "select * from Person p where  p.name = :name",nativeQuery = true)
    List<Object> findByIdLessThanAndNameLike1(@Param("name") String name);

注意,在测试最后一行的占位符时候报错说没用@Param,这时候的jar包引入错误,应该引spring的param的包

此外还有一种

 @PersistenceContext
    EntityManager em;
上面这两个写在方法上面   em可以随便取名
String sql="SELECT name as name1,age as age1,address as address1 FROM person WHERE person.name = '"+name+"' and person.age='"+age+"'";
            Query nativeQuery1 = em.createNativeQuery(sql);
            nativeQuery1.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            List<HashMap> resultList1 = nativeQuery1.getResultList();
            Object s = resultList1.get(0).get("name1");
            String m=s.toString();
            //增加对象集合
            List<TestVO> testVOList = new ArrayList<>();
            TestVO testVO1 = new TestVO();
            for(HashMap hashMap:resultList1){
                testVO1.setAddress(hashMap.get("address1").toString());
                testVO1.setAge(hashMap.get("age1").toString());
                testVO1.setName(hashMap.get("name1").toString());
                testVOList.add(testVO1);
            }
            //TestVO testVO1=(TestVO)resultList1.get(0);//nativeQuery1.unwrap(TestVO.class);
            return testVOList.get(0);
posted @ 2022-10-19 15:37  panyanquandexiaodi  阅读(65)  评论(0编辑  收藏  举报