这一讲主要介绍Spring Data JPA的封装。和设计相关的东西都是仁者见仁,智者见智的事情,如果你有更好的封装方案可以和我交流,互相学习。这一讲会讲如下一些内容 - 扩展Spring Data JPA实现自己的一些特殊方法 - 创建一个自己的BaseRepository - 封装Specification来快速完成一些简单的查询操作 - 封装分页和排序操作。
在一些特殊时候,我们会设计到对Spring Data JPA中的方法进行重新实现,这将会面临一个问题,如果我们新创建一个实现类。如果这个实现类实现了JpaRepository接口,这样我们不得不实现该接口中的所有方法,如果不实现该接口,那意味着我们就无法使用Spring Data JPA中给我们提供的那些好用的方法。所以在扩展的时候我们需要按照如下方法进行。
这些需要注意的是,接口和实现类的名称必须遵循spring data jpa的命名规范,如果要为接口StudentBaseRepository写自定义的接口,首先需要创建一个接口名称为StudentBaseRepositoryCustom,这表示是自定义接口,实现类的名称必须是StudentBaseRepositoryImpl,此时当StudentBaseRepository实现StudentBaseRepositoryCustom之后就可以使用我们自己实现的方法了,同理StudentBaseRepository也可以继承JpaRepository来获取Spring Data Jpa 给我们的方法。
StudentBaseRepositoryCustom代码如下
publicinterfaceStudentBaseRepositoryCustom {//基于原生态的sql进行查询
List
package org.konghao.repo.base;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import java.io.Serializable;
import java.util.List;
/**
* Created by konghao on 2016/12/7.
*/@NoRepositoryBeanpublicinterfaceBaseRepository<T,IDextendsSerializable> extendsJpaRepository<T,ID> {
List listBySQL(String sql);
}
该接口实现了JpaRepository,这样就保证拥有了Spring Data JPA中那些比较好用的方法,然后可以自定义自己需要的方法,代码中定义了一个listBySQL的方法。需要注意的是@NoRepositoryBean,这个表示该接口不会创建这个接口的实例(我们原来定义的StudentPageRepository这些,Spring Data JPA的基础组件都会自动为我们创建一个实例对象,加上这个annotation,spring data jpa的基础组件就不会再为我们创建它的实例)。之后我们编写实现类BaseRepositoryImpl
/**
* Created by konghao on 2016/11/24.
*/@EnableJpaRepositories(basePackages = {"org.konghao"},
repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class//指定自己的工厂类
)
@SpringBootApplicationpublicclassDemoApplication {publicstaticvoidmain(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
到这里我们的整个自定义工厂的流程就结束了,我们写一个接口实现BaseRepository即可
/**
* Created by konghao on 2016/12/7.
*/publicinterfaceStudentExtendsRepositoryextendsBaseRepository<Student,Integer> {/**
* 原来JPARepository的方法依然可以使用*/
List findByNameAndAddress(String name, String address);
}
测试类中的代码如下
@TestpublicvoidtestBaseRepository() {
//直接使用BaseRepository中的方法
List list = studentExtendsRepository.listBySQL("select address,count(*) from t_student group by address");
Assert.assertEquals(2,list.size());
Assert.assertEquals("km",list.get(0)[0]);
//原JpaRepository的方法依然可以使用
List list2 = studentExtendsRepository.findByNameAndAddress("bar","zt");
Assert.assertEquals(1,list2.size());
}
1、网络上现成的资料
格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
linux sed 批量替换多个文件中的字符串
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
例如:替换/home下所有文件中的www.admi
对于AJAX应用(使用XMLHttpRequests)来说,向服务器发起请求的传统方式是:获取一个XMLHttpRequest对象的引用、发起请求、读取响应、检查状态码,最后处理服务端的响应。整个过程示例如下:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange
Hive中的排序语法 2014.06.22 ORDER BY
hive中的ORDER BY语句和关系数据库中的sql语法相似。他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间。
与数据库中 ORDER BY 的区别在于在hive.mapred.mode = strict模式下,必须指定 limit 否则执行会报错。
post-commit hook failed (exit code 1) with output:
svn: E155004: Working copy 'D:\xx\xxx' locked
svn: E200031: sqlite: attempt to write a readonly database
svn: E200031: sqlite: attempt to write a