想做一个springboot+jpa的demo
1 遇到问题
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataServiceImpl': Unsatisfied dependency expressed through field 'agvStatusDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'agvStatusDao': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract void com.puzek.sp.Report.dao.AgvStatusDao.queryAgvStatusById(java.lang.Integer,java.lang.String)!
遇到这种问题多半是自定义的sql有问题,自定义sql语句一般操作的是表对应的实体类,而不时数据库中的表名,字段也是实体类中的字段,例如:
我的表名是agvstatus,然后我对应的实体类是AgvStatus,此时sql语句不能写成 update agvstatus set uptime=:uptime where id=:id,而应如下图的格式使用实体类.属性名
2.问题2,少了事务注解@Transactional
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
注释掉此注解就会报错
3、新增一条数据
jpa自带保存数据的方法saveAndFlush()方法,他是所有的选项都必填的,就连主键ID也必须要自己设置的这种,一点都不灵活,比如主键我们设置了不能为空的限制,每次增加都需要手动去设置自增长id,可是一般我们都不太确定下一个id是什么
想要灵活性的话,我们采取自定义的方式进行插入自己想插入的值,因为我的主键设置了不能为空的限制,所以属于必填选项,主键自增可以采用这种nextval('status_id_seq') 这种方式查询下一个主键id(ps:我用的是postgresql,可能每个数据的查询下一个自增长的id可能不太一样)
4、修改数据
5.删除
删除直接使用的是jpa自带的通过id删除的方法的,当然如果不想要使用id删除也可以自定义使用自定义sql
6.条件查询
通过用户名和密码查询用户,图中的两种方式都是可以的,第一个注释掉的是采用自定义sql的方式,第二种则是采用jpa的命名方式,要查询的条件名首字母大写采用and连接起来,测试两种方法也是通过的
7.分页查询加排序加条件
首先继承CrudRepository, JpaSpecificationExecutor这两个类
返回的是这种格式的数据:
{"total":3,"content":[{"id":3,"name":"developer","pwd":"$2a$10$tsKDesGQrzSZMwnykAe2B.WA3Z95HIAY4Hf6LrBGLSR8vofs6rouS","description":"研发用户","roid":3},{"id":2,"name":"test","pwd":"$2a$10$tsKDesGQrzSZMwnykAe2B.WA3Z95HIAY4Hf6LrBGLSR8vofs6rouS","description":"测试用户","roid":2},{"id":1,"name":"admin","pwd":"$2a$10$tsKDesGQrzSZMwnykAe2B.WA3Z95HIAY4Hf6LrBGLSR8vofs6rouS","description":"超级用户","roid":1}],"pageable":{"sort":{"orders":[{"direction":"DESC","property":"id","ignoreCase":false,"nullHandling":"NATIVE"}]},"page":0,"size":5}}
8.自定义SQL接收参数时有两种方式
冒号+变量名 如上面的通过用户名和密码查询 :name
占位符? 如上面的新增 1?, 2?