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);