JPQL
1.是一种和SQL语句类似的中间性和对象化查询语句
2.在JPQL语句中都可以执行删除 查询 修改 的语句 都是通过Query接口来进行实现的
int executeUpdate(); 执行update 或者deleta 语句 List getResultList(); 执行Select 语句并返回一个集合结果 Object getSingleResult(); 执行查询语句返回一个对象 int getMaxResults(); 返回结果实现中的最大的一个数 Query setFirstResult(int var1); 设置实体类开始返回的结果集 Query setHint(String var1, Object var2); 对特定参数类进行编写对应的提示 Query setParameter(...) 给对应的SPQL语句进行辅助上对应的参数
入门:
/**
*/ @Before public void getVoidBuffer(){ entityManagerFactory = Persistence.createEntityManagerFactory("jpa-01"); entityManager = entityManagerFactory.createEntityManager(); transaction = entityManager.getTransaction(); transaction.begin(); } @After public void getVoidColse(){ transaction.commit(); entityManager.close(); entityManagerFactory.close(); } /** * 其他的查询的语句 * 支持函数查询 * select max(st.s_age) from Student st where st s_id = ?1 * 两表查询 * * select st,o from Student st ,Orders o where o.r_id= ?1 or st.s_id > ?2 * * select o from Student st inner join Orders o where o.r_id= ?1 or st.s_id > ?2 * select o from Student st join Orders o where o.r_id= ?1 or st.s_id > ?2 * select o from Student st left join Orders o where o.r_id= ?1 or st.s_id > ?2 */ //对象数据类型 @Test public void getVoidSel05(){ //分页查询 //query //List resultList = entityManager.createQuery("select st FROM Student st") List resultList = entityManager.createQuery("select new Student(st.s_name,st.s_sex ) FROM Student st WHERE st.s_age > ?1 and st.s_sex = ?2 ") .setParameter(1,20) .setParameter(2,"男") .getResultList() ; System.out.println(resultList); } //返回非对象集合的 @Test public void getVoidSel04(){ //分页查询 //query //List resultList = entityManager.createQuery("select st FROM Student st") List resultList = entityManager.createQuery("select st.s_name,st.s_sex FROM Student st WHERE st.s_age > ?1 and st.s_sex = ?2 ") .setParameter(1,20) .setParameter(2,"男") .getResultList() ; System.out.println(resultList); } @Test public void getVoidSel03(){ //分页查询 //query //List resultList = entityManager.createQuery("select st FROM Student st") List<Student> resultList = entityManager.createQuery("select st FROM Student st WHERE st.s_id > ?1 ") .setParameter(1,1) .setMaxResults(2) .getResultList() ; for (Student student : resultList) { System.out.println(student); } } @Test public void getVoidSel02(){ //分页查询 //query //List resultList = entityManager.createQuery("select st FROM Student st") List<Student> resultList = entityManager.createQuery("select st FROM Student st WHERE st.s_name like :names ") .setParameter("names","%王%") .setMaxResults(2) .getResultList() ; for (Student student : resultList) { System.out.println(student); } } @Test public void getVoidSel01(){ //分页查询 //query //List resultList = entityManager.createQuery("select st FROM Student st") List<Student> resultList = entityManager.createQuery("select st FROM Student st WHERE st.s_name like ?1 ") .setParameter(1,"%王%") .setMaxResults(2) .getResultList() ; for (Student student : resultList) { System.out.println(student); } } /** 查询 */ @Test public void getVoidSel(){ //分页查询 //query //List resultList = entityManager.createQuery("select st FROM Student st") List<Student> resultList = entityManager.createQuery("select st FROM Student st") .setFirstResult(1) .setMaxResults(2) .getResultList(); for (Student student : resultList) { System.out.println(student); } } /** 添加 */ @Test public void getVoid(){ Student student1 = new Student(); student1.setS_name("王麻子"); student1.setS_age(45); student1.setS_sex("男"); entityManager.persist(student1); }
注解的方式进行查询
@NamedQuery(name = "queryStudent",query = "select st FROM Student st")
@Table(name = "JPA_STUDENT")
@Entity
public class Student {
/** */ private Integer s_id ; private Integer s_age ; /** */ private String s_name; private String s_sex; public Student() {
/** 注解的方式 进行查询 */ @Test public void getVoid01(){ List queryStudent = entityManager.createNamedQuery("queryStudent") .setParameter(1, 1).getResultList(); System.out.println(queryStudent); } ----------- 本地化的sql /** 注解的方式 进行查询 本地化的sql */ @Test public void getVoid02(){ String sql="select p.s_name from JPA_STUDENT p where p.s_id > ? "; List queryStudent = entityManager.createNativeQuery(sql) .setParameter(1, 1).getResultList(); System.out.println(queryStudent); } /** 注解的方式 进行查询 */ @Test public void getVoid01(){ /** *实体类上必须要有 * /@NamedQuery(name = "queryStudent",query = "select st FROM Student st WHERE st.s_age > ?1 ") */ List queryStudent = entityManager.createNamedQuery("queryStudent") .setParameter(1, 1).getResultList(); System.out.println(queryStudent); } ------------------------- 二级缓存 配置 <property name="hibernate.cache.use_query_cache" value="true"/> <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" /> 加载 hibernate-release-5.0.7.Final\project\hibernate-ehcache\src\test\resources src目录下的ehcache.xml 在实体类上加载 @Cacheable //标识缓存 当前的实体类的 在查询的query中加载设置 .setHint(QueryHints.HINT_CACHEABLE,true) //支持是否二级缓存, 如不加 这咨询两sql语句