最近在学习springboot使用jpa操作数据库,总结一下。
Dao层创建与JavaBean对应的接口,继承JpaRepository<K,E>接口
@Repository
public interface AccountDao extends JpaRepository<Account,Integer>{
}
//Account对应的是JavaBean实体类,Integer是实体类主键的类型
无需创建接口的实现类
个人学习到的jpa的几种查询方法:
1、jpa自带的方法:
使用的编程语言是Kotlin
//主要记录分页和排序
//service层
class AccountServiceImpl:AccountService{
@Autewired
lateinit var accountDao:AccountDao
override fun queryOnLoad(apu: AccountPageUtil): Map<String, Any?> {
//创建排序对象
val sort:Sort=Sort.by(Sort.Direction.ASC,"id")
//创建分页对象
val page:Pageable=PageRequest.of(apu.getStart(),apu.rows,sort)
val map = hashMapOf<String,Any?>()
//通过findAll方法进行分页查询
var pageResult=accountDao.findAll(page)
//findAll(Pageable)返回的是page对象,其中包含了分页所需要的总页数、总信息条数、每页中的对象等资源。可以查看源码获取所需要的信息
//分页的结果
map["rows"]=pageResult.content
//分页总数
map["total"]=pageResult.totalPages
return map
}
}
2、jpa可以通过方法名进行查询
Dao层的接口
@Repository
interface SubjectDao:JpaRepository<Subject,Int>{
/**
* 根据Clazz查询
*/
fun findByClazz(clazz:String,pageable:Pageable):List<Subject>
/**
* 根据sid精确查询单个对象
*/
fun findBySid(id:Int):Subject
}
推荐博客:http://www.ityouknow.com/springboot/2016/08/20/spring-boo-jpa.html
3、自定义SQL查询语句进行查询
Dao层的接口
@Repository
interface SubjectDao:JpaRepository<Subject,Int>{
@Query(value="select sid as sid,sname as sname,slevel as slevel,clazz as clazz,pname as pname,pid as pid from Subject where sid like %?1%) ")
fun myFindBySidLike(sid:Int,pageable: Pageable):List<Map<String,Any>>
}
在这里有几个注意点
- @Query中有一个属性:nativeQuery = true 添加该属性等于true则是原生SQL语句查询,不添加则是HQL语句(Hibernate面向对象的查询)
- like模糊查询时可在后面直接加%
- 方法中给的参数类型必须和实体类中定义的类型一样,否则会报类型不一致的错
- 方法的返回值好像只能返回List<Map<K,V>>类型(因为我只试过返回Page类型和List类型,都是类型不对)。Map中的Key就是查询语句中的别名,所以这里添加了别名。
- 方法名不能是findBySidLike,因为这样他就不会执行自己写的SQL语句。
4、复杂的条件拼接查询
看到其他人的博客中说,Dao层接口再继承一个接口JpaSpecificationExecutor<实体类>
Dao层
@Repository
i