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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~