由于这是我的第一篇工作总结,所以我会尽量把自己遇到的典型问题写出来;以后我会每周都写一篇总结,写一写自己遇到的难题以及解决方案,另外说明一下,由于本人是初入行的菜鸡,所以也只能写一些技术含量并不高的问题(对我来说是难题)。
首先说一下我所做的项目是使用spring+spring data jpa,jpa操作数据库是真的很方便,但是对于一些较为复杂的业务流程就不行了,这时候还是使用sql语句更加便利,然而由于用习惯了jpa,导致现在我的mybatis和sql语句都快忘记了0.0,看来我要抽空去复习一下,因此我们平时工作中不仅要不断的学习,也要持续不断的复习巩固。
问题1:当时让我去改一个问题单,它的大致意思是前端有一个功能返回的错误信息显示英文,而为了用户的体验度建议改成中文,对了在这之前我要说明一下自己是做纯后端的,当时我首先就想到直接翻译成中文不就行了?但是后来我知道了后端返给前端的数据一般是不能使用中文的,因为如果把项目部署到服务器上后,不同的系统去访问可能会存在中文乱码的问题,然后我就查看了项目的代码,发现返给前端的数据果然都没有英文的,甚至连注释都是英文的(当然了这个就没有多大的必要);当然如果是保存到数据库中的数据就没有限制了,如果你正好把错误信息存放到了数据库中,这时候为了方便建议直接存中文。还有一些批量的操作怎么让它返回具体对应每一条的是否成功信息,其实很简单,只需要使用一个List<map<String,Object>>封装数据返给前端即可,map里的数据有"id":对应的就是这一行数据的标识id,"isSuccess":布尔类型数据表示是否成功,"msg":表示成功或失败的原因;这样的话通过id就能知道对应这行数据是否成功以及具体的原因。
问题2:在数据库中表的同一个字段可以根据不同的值去查询,比如表中有个字段为userName,userName的值有很多,例如需要查询出所有姓张和姓马的数据,实际上就是使用or来拼接查询条件,但是如何用jpa来实现?高级查询CriteriaBuilder cb的cb.or(查询条件)就可以实现或者的关系,示例代码如下:
List<Predicate> list = new ArrayList<Predicate>();
List<String> nameList = (List<String>) map.get("name");
if(null !=map.get("name") && ((List<String>) map.get("name")).size()>0){
for (String name : nameList) {
list.add(cb.like(root.get("userName").as(String.class),name+"%"));
}
}
Predicate[] predicates = new Predicate[list.size()];
return cb.or(list.toArray(predicates));
//specfication的一些其他用法
Specification<UserModel> spec = new Specification<UserModel>() {
public Predicate toPredicate(Root<UserModel> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate p1 = cb.like(root.get("name").as(String.class), "%"+map.getName()+"%");
Predicate p2 = cb.equal(root.get("id").as(Integer.class), map.getId());
Predicate p3 = cb.gt(root.get("age").as(Integer.class), map.getAge());
//把Predicate应用到CriteriaQuery中去,因为还可以给CriteriaQuery添加其他的功能,
//比如排序、分组等
query.where(cb.and(p3,cb.or(p1,p2))); //根据需求灵活组合
//添加排序的功能
query.orderBy(cb.desc(root.get("uuid").as(Integer.class)));
return query.getRestriction();
}
};
暂时就写这么多,当然还有很多的问题没有写出来,等下周有时间在写。