【IT168 技术文档】
在Java持久化查询语言是对EJB 查询语言(QL)的一种扩展。该查询语言允许你同时在你的应用程序的实体上执行动态和静态的查询。这个查询语言有些像 SQL。不过,它确实从 SQL中受益。Java持久化查询语言操作的是实体和实体间的关系,而不是实际的关系数据库模型。这就使得查询可以移植,不用去管底层的数据库。
查询以三种方式进行: select、update和 delete方式。 select 查询返回数据库中的实体集合。这个通常会有特定的约束,存在于一个有限的集合中。 update 查询改变一个或者多个现存的实体的属性,或者是一个实体集的属性。最后, delete语句数据库中删除一个或者多个的实体。
你可以有选择的创建查询。最为基本的方法就是简单的从实体管理器中找到一个。下面的查询例子就是使用实体管理器中现存的 createQuery 方法。
Query query = em.createQuery(queryStatement);
当你使用Query 对象后,通过使用更丰富的查询语言,你可以创建,读入,更新,删除实体。虽然 find, remove, persist, 和 merge 方法能很好的工作,但是查询对象为你提供更多的灵活性。
一、实体查找
一、实体查找
当你检索实体的时候,select 查询会应用到规范标准。下面的查询语言语句选择了 Dodgers球队所有的 player。
select c from Player c where c.team.teamName = 'Los Angeles Dodgers'
构造一个 Query实例和执行它代码如下:
Query q = em.createQuery("select c from Player c where c.team.teamName = 'Los Angeles Dodgers'"); List<Player> playerList = q.getResultList();
当然,你或许想通过设置参数来查找。你能过API实现方法,就是调用 query对象的 setParameter方法。下面的代码创建了同样的查询,并且打印结果,但此时可以让你动态的设定球队的名字:
Query q = em.createQuery("select c from Player c where c.team.teamName = :name"); q.setParameter("name", aTeamName); List<Player> playerList = q.getResultList(); for(Player p : playerList) { System.out.println(p.toString()); }
二、实体更新
一旦你检索到一个受管制的实体,无论是通过查询数据库得到的,还是通过使用find 方法得到的,更新实体就和修改实体的属性一样简单,提交已经启动的事务就可以了。举个例子,你可以通过简单的调用 player实体的setJerseyNumber 方法改变一个 player的号码。一旦你提交了事务,实体就被更新,有了新的号码。下面的例子中,所有的player都更新了他们运动衫上的球衣号码。
em.getTransaction().begin(); for(Player p : playerList) { // add 1 to each players jersey number int jersey = p.getJerseyNumber(); p.setJerseyNumber(jersey + 1); } em.getTransaction().commit();
当然,一个查询也能实现同样的功能:
Query q = em.createQuery("update Player p " + "set p.jerseyNumber = (p.jerseyNumber + 1) " + "where p.team.teamName = :name"); q.setParameter("name", aTeamName); em.getTransaction().begin(); q.executeUpdate(); em.getTransaction().commit();
三、删除实体
最后,你可以使用查询来删除实体。下面的代码就是从数据库中删除了 Anaheim Angels球队。
String aTeamName = "Anaheim Angels"; ... Query q = em.createQuery("delete from Team t " + "where t.teamName = :name"); q.setParameter("name", aTeamName); em.getTransaction().begin(); q.executeUpdate(); em.getTransaction().commit();