jpa_JPQL
一、META-INF 下的 persistence.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="test_jpa_2" transaction-type="RESOURCE_LOCAL">
<!-- 3、
配置使用什么ORM 产品来作为JPA的实现
1、实际上配置的是 javax.persistence.spi.PersistenceProvider 接口的实现类
2、若JPA 项目中有一个JPA 的实现产品,则也可以不需要配置该节点
-->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- 4、添加持久化类 -->
<class>com.demo.pojo.Customer</class>
<class>com.demo.pojo.Order</class>
<properties>
<!-- 1、连接数据库的基本信息 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="709003"/>
<!-- 2、配置JPA 实现产品的基本属性,配置hibernate 基本属性 -->
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
package com.demo.test;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.NamedQuery;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.hibernate.ejb.QueryHints;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.demo.pojo.Customer;
import com.demo.pojo.Order;
public class TestBiac {
private EntityManagerFactory entityManagerFactory = null;//会话工厂
private EntityManager entityManager = null;//会话
private EntityTransaction transaction = null;//事务
//EntityTransaction接口用来管理资源层实体管理器的事务操作。
//通过调用实体管理器的getTransaction方法获得其实例
@Before
public void init() {
entityManagerFactory = Persistence.createEntityManagerFactory("test_jpa_2");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
}
@After
public void destory() {
transaction.commit();
entityManager.close();
entityManagerFactory.close();
}
@Test
public void testJpqlUpdate(){
String jpql = "update Customer c set c.lastName=? where c.id=?";
int l = entityManager.createQuery(jpql).setParameter(1, "YYYY")
.setParameter(2, 4).executeUpdate();
System.out.println(l);
}
//使用函数
@Test
public void testJpqlFunction(){
String jpql = "select upper(c.eamil) from Customer c ";
List<String> l = entityManager.createQuery(jpql).getResultList();
for(String c : l){
System.out.println(c);
}
}
//嵌套子查询
@Test
public void testSubQuery(){
String jpql = "select o from Order o where o.customer in "
+ "(select c from Customer c where c.lastName=?)";
List<Order> l = entityManager.createQuery(jpql).setParameter(1, "熊大").getResultList();
System.out.println(l.size());
}
//如果存在FETCH 获取到的查询结果就是实体对象,没有FETCH 获取到的查询结果就是object[]
//也可以将FETCH 去掉,试一试
@Test
public void testLeftOuterFetch(){
//左外连接查询
// String jpql = "from Customer c left outer join FETCH c.orders where c.id=?";
// Customer c = (Customer)entityManager.createQuery(jpql).setParameter(1, 3).getSingleResult();
// System.out.println(c.getLastName());
// System.out.println(c.getOrders().size());
String jpql = "from Customer c left outer join c.orders where c.id=?";
Object[] obj = (Object[]) entityManager.createQuery(jpql).setParameter(1, 3).getSingleResult();
System.out.println(obj[0]+" "+obj[1]);
}
@Test
public void testGroupBy(){
String jpql = "select o.customer from Order o group by o.customer having count(o.id) >=2";
List<Customer> l = entityManager.createQuery(jpql).getResultList();
for(Customer c : l){
System.out.println(c);
}
}
@Test
public void testOrderBy(){
/* 区别:
order by 排序查询、asc升序、desc降序
group by 分组查询、having 只能用于group by子句、作用于组内,
having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。
*/
String jpql = "from Customer c order by c.age desc";
List<Customer> l = entityManager.createQuery(jpql).getResultList();
for(Customer c : l){
System.out.println(c);
}
}
//当前项目中没有配置缓存,因此在其他项目中运行后复制回来的
@Test
public void testQueryCache(){
String jpql = "from Customer c where c.age >?";
List l = entityManager.createQuery(jpql).setParameter(1, 1)
.setHint(QueryHints.HINT_CACHEABLE, true) //将查询的结果放入到缓存中的方法
.getResultList();
System.out.println(l.size());
l = entityManager.createQuery(jpql).setParameter(1, 1)
.setHint(QueryHints.HINT_CACHEABLE, true)
.getResultList();
System.out.println(l.size());
}
//原生sql 语句的支持
@Test
public void testCreateNativeQuery () {
String sql = "select last_name,age from t_customer";
//当查询多条数据,结果集使用的是对象数组存储一行数据,List 存多行数据
List l = entityManager.createNativeQuery(sql).getResultList();
System.out.println(l);
}
/*
createNamedQuery 创建命名查询方式 为了使用测试 Query接口的主要方法 getSingleResult() 方法
Object getSingleResult()
用于执行只返回单个结果实体的select语句。
*/
@Test
public void testCreateNamedQuery() {
//.getSingleResult(); 查询结果是唯一的一条,返回值是object 类型
// Customer c= (Customer) entityManager.createNamedQuery("testNameQuery")
// .setParameter(1, 12).getSingleResult();
//testNameQuery 这个名字,在实体类中
//@NamedQuery(name="testNameQuery",query="select c from Customer c where c.id=?1")
/*c.id=?1 这么写,是因为在注解中执行jpql 的时候,不会有自动的识别?占位符 索引值的功能,
* 因此需要手动标注?占位符号的顺序
*/
List l= entityManager.createNamedQuery("testNameQuery")
.setParameter(1,3).getResultList();
System.out.println(l);
}
/*
* 构造方法的形式往对象(实体类Customer)里传参
*/
@Test
public void testPartProperties2() {
// 下列写法,jpql 语句,查询出来的数据,存入到实体对象中
String jpql = "select new Customer(c.lastName,c.age) from Customer c where c.age > ?";
Query q = entityManager.createQuery(jpql);
// 占位符的索引值,从1开始,不是0了
q.setParameter(1, 1);
List<Customer> list = q.getResultList();
for(Customer c : list){
System.out.println(c);
}
}
// 默认情况下,部分属性查询,查询出来的数据,是对象数组
@Test
public void testPartProperties1() {
String jpql = "select c.lastName,c.age from Customer c where c.age > ?";
Query q = entityManager.createQuery(jpql);
// 占位符的索引值,从1开始,不是0了
q.setParameter(1, 1);
List<Object[]> list = q.getResultList();
for(Object obj[] : list){
System.out.println(obj[0]+" "+obj[1]);
}
}
// 生成表结构
@Test
public void testHelloWord() {
String jpql = "from Customer c where c.age > ?";
//jpql 也是在Hibernate基础上的,Hibernate加载对象而不是表名
Query q = entityManager.createQuery(jpql);
// 占位符的索引值,从1开始,不是0了
q.setParameter(1, 1);
List<Customer> list = q.getResultList();
System.out.println(list.size());
System.out.println(list);
}
}

浙公网安备 33010602011771号