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语句
京公网安备 11010502036488号