JPA基础(九):使用JPQL语句进行查询

时间:2022-09-11 13:40:19

查询语言(JPQL)

这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。(跟HQL真的很像- -)

 1     @Test
2 public void query(){
3 EntityManagerFactory factory=Persistence.createEntityManagerFactory("sample");
4 EntityManager em=factory.createEntityManager();
5 Query query=em.createQuery("select o from Person o where o.id=?1");
6 query.setParameter(1, 3);
7 Person p=(Person) query.getSingleResult();
8 System.out.println(p.getName());
9 em.close();
10 factory.close();
11 }


只是查询的时候不用开启事务,只有当真正改变数据的时候需要开启事务,“?1”的用的是占位符的形式,1 表示索引号,不推荐使用字符串拼接的方式,形如 "select o from Person o where o.id="+id 这是非常不安全的,容易引起非法注入。


 1     @Test
2 public void deleteQuery(){
3 EntityManagerFactory factory=Persistence.createEntityManagerFactory("sample");
4 EntityManager em=factory.createEntityManager();
5 em.getTransaction().begin();
6 Query query=em.createQuery("delete from Person o where o.id=?1");
7 query.setParameter(1, 3);
8 query.executeUpdate();
9 em.getTransaction().commit();
10 em.close();
11 factory.close();
12 }

查询删除时需要开启事务


 

 1     @Test
2 public void updateQuery(){
3 EntityManagerFactory factory=Persistence.createEntityManagerFactory("sample");
4 EntityManager em=factory.createEntityManager();
5 em.getTransaction().begin();
6 Query query=em.createQuery("update Person o set o.name=:name where o.id=:id");
7 query.setParameter("name", "brian");
8 query.setParameter("id", 1);
9 query.executeUpdate();
10 em.getTransaction().commit();
11 em.close();
12 factory.close();
13 }

这里用的是命名参数的形式,再通过setParameter方法将参数设置进去。