企业级开发QL语言.ppt
《企业级开发QL语言.ppt》由会员分享,可在线阅读,更多相关《企业级开发QL语言.ppt(44页珍藏版)》请在三一文库上搜索。
1、第四章,EJB3.0 QL语言,课程内容,查询Query的API 两种参数查询:命名参数查询和位置参数查询 EJB3.0 QL语言 排序 批量更新和删除 连接操作 投影 使用操作符:NOT、BETWEEN、IN、LIKE、NULL、EXISTS等 字符串函数,查询(QUERY)API,一个查询API是Java持久化的一个开放接口,我们可以在运行期间通过实体管理器来获取它。Queue接口的定义如下: Package javax.persistence; public interface Query public ListgetResultList(); public object getSing
2、leResult(); public int executedate(); pubiic Query setMaxResults(int maxResult); pubiic Query setFirstResult(int startPosition); pubiic Query setHit(String hintName,Object value); pubiic Query setParameter (String name,Object value); public Query setParameter(String name,Date value, TemporalType tem
3、poralType); public Query setParameter(int position,Object value); /等等 ,查询Query的创建我们可以使用EntityManager中的以下方法: package javax.persistence; public interface EntityManager public Query createQuery(String ejbqlString); public Query createNamedQuery(String name); public Query createNativeQuery(String sqlStr
4、ing); public Query createNativeQuery(String sqlString,Class resultClass); public Query createNativeQuery(String sqlString,String resultSetMapping); ,参数查询,像java.sql.PreparedStatement在JDBC中 EJB-QL允许你指定参数在查询定义中 所以我们可以重用和执行多次参数查询,参数查询也和SQL中的参数查询类似 EJB3.0 QL支持两种方式的参数定义方式:命名参数和位置参数。,命名参数查询,我们可以在EJB3 QL语句中
5、使用参数来动态的执行我们需要查询的命令,命名参数查询的格式为:“:+参数名字”,如以下语句: Query query = entityManager.createQuery(“from Order o where o.id = :myId“); /设置查询中的参数 query.setParameter( “myId”, 2 ); 同样的,我们也可以使用多个参数在查询语句中 注意:不允许在同一个查询中使用两个相同名字的命名参数。,位置参数查询,位置参数: Query query = entityManager.createQuery(“select o from Order o where o.
6、id = ?1“); / 设置查询中的参数 query.setParameter(1, 2 ); / 1表示第一个参数,2是参数的值 如果考虑到以后的应用需要在不同的EJB3.0 运行环境中运行,建议最好使用位置参数,这样可以保证应用的可移植性。,EJB3.0QL语言,EJB3.0 QL主要对以下做了改进:, 批量更新和删除 连接操作 Group By从句 Having从句 投影 子查询 动态查询 命名参数 在SELECT从句中构造新的对象,排序,在EJB3.0 QL语言中,排序同SQL的使用方法是很类似的,它使用ORDER BY子句。 ORDER BY子句的语义同SQL中的类似。例如,我们可
7、以构造一个简单的查询,使用ORDER BY子句来返回一个以用户姓名的字母为顺序的排列表: select p from Person p order by p.name ORDER BY子句中默认的列表排序方式是升序的。升序和降序分别用“ASC“和“DESC“表示。,批量更新和删除, 操作应用于指定的实体及其所有的子类。 操作不会级联到关联的实体。 在批量更新中指定的值的类型必须同数据库中的目标字段相匹配。 批量更新直接在关系型数据库中进行。 持久化上下文并不会同操作结果进行同步。,批量更新就是一次性的完成多条记录的更新;批量删除就是一次性的完成从数据库中删除多条记录的操作。我们应该能很容易的猜
8、到它们的含义。这些操作必须遵循以下规则:,批量更新/删除,如以下查询将所有的定单的金额加10,查询如下: Query query = em.createQuery(“update Order as o set o.amount=o.amount+10“); /update的记录数 int result = query.executeUpdate();,批量删除: 如以下查询语句把金额小于100 的订单删除,代码如下: Query query = em.createQuery(“delete from Order as o where o.amount 100“); /delete的记录数 in
9、t result = query.executeUpdate();,连接操作,连接操作也是关系型数据库中常见的操作。通常,表中的外键会对应另一表中的主键。 为了设计出符合范式的数据库设计,尽量不要在不同表间存储重复的数据。 连接操作能够限定关系型数据库返回符合条件的不同记录。默认的时候,EJB-QL采用内部连接(inner join)完成记录的获取工作。 比如,下面给出的查询只会选择出至少存在一个雇员的所有公司集合。 select c from Company c join c.employees e,Group By和Having从句,在关系型数据库操作中,Group By和Having从句
10、也是常见的。但是,这对于EJB-QL语言却是新增的。Group By会根据属性集合对结果进行分组(聚合)。比如,我们需要从数据库中了解到男女职员各自的数量,则可以使用如下的EJB-QL: select e.sex,count(e) from Employee e Group By e.sex,注意这些从句必须遵循如下若干原则: 处理聚合函数(比如,SUM、AVG等)外,出现在select从句 的任何参数必须出现在Group By从句中。 Having从句必须针对Group By中的参数或其他聚合函数给定 限制条件。 EJB3.0对于那些使用了Having从句,但并未使用Group By从 句的
11、EJB-QL不作要求。,投影,投影允许EJB-QL针对实体集合进行查询,而仅仅从实体返回特定的属性。如果不要求整个实体或整个实体集合都返回一个调用者,则使用投影能够提高查询效率。,下面是EJB-QL的示例代码:,/直接查询我们感兴趣的属性(列) Query query = em.createQuery(“select p.personid, p.name from “ +“Person p order by p.personid desc “); /集合中的元素不再是Person,而是一个Object对象数组 List result = query.getResultList();,在Sele
12、ct从句中构造对象,新的EJB-QL引入了一个最令人兴奋、功能方便的对象构造特性。那就意味着我们可以在SELECT从句中实例化对象,并作为查询结果返回给调用者,通常在使用投影的时候,开发者经常会使用这一特性。,以下的代码片段使用了含有对象构造语句的查询语句:,public List getSomeInfor() String ejbSql= “select new com.ejb3.query.CompanyEmploueeInfo(c.name,e.name)“ +“from Employee e join e.Comany c“; Query query=Em.createQuery(ej
13、bSql); return query.getResultList(); ,使用操作符,BETWEEN:,比如,我们使用操作符BETWEEN来查询金额在300到1000之间的订单,代码如下所示: Query query = em.createQuery( “select o from Order as o where o.amount between 300 and 1000“); List result = query.getResultList();,IN:,我们使用操作符IN来查询所有年龄为18,25 的Person。如以下语句所示: Query query = em.createQue
14、ry(“select p from Person as p where p.age in(18,25)“); List result = query.getResultList();,LIKE :,和使用SQL语句查询类似,使用操作符LIKE同样也可以实现模糊查询。如以下语句就可以实现查找以字符串“li“开头的Person: Query query = em.createQuery(“select p from Person as p where p.name like li%“); List result = query.getResultList();,NULL和IS NULL:,如以下语
15、句使用了操作符NULL查询了所有没有地址的Order: Query query = managerNew.createQuery(“select o FROM Order as o where o.address is null“); 以下语句使用了操作符IS NULL查询了所有地址非空的Order: Query query = managerNew.createQuery(“select o FROM Order as o where o.address is not null“);,IS EMPTY和IS NOT EMPTY,操作符IS EMPTY是针对集合属性(Collection)的操
16、作符。可以和NOT一起使用。如以下语句查询了orderItems集合为空的Order: Query query = managerNew.createQuery(“select o FROM Order o where o.orderItems is empty by o.vender desc“); List result = query.getResultList(); 如以下语句使用了NOT查询了orderItems集合非空的Order: Query query = managerNew.createQuery(“select o FROM Order o “+“where o.orde
17、rItems is not empty by o.vender desc“); List result = query.getResultList();,EXISTS,操作符号NOTEXISTS需要和子查询语句(如SELECT子查询语句等)配合使用。如以下语句: /如果存在订单号为2 的订单,就获取所有OrderItem Query query = em.createQuery(“select oi from OrderItem as oi “+“where exists (select o from Order o where o.orderid=2)“); List result = qu
18、ery.getResultList(); /如果不存在订单号为10 的订单,就获取id为1 的OrderItem query = em.createQuery(“select oi from OrderItem as oi where “+“oi.id=1 and not exists (select o from Order o where o.orderid=10)“); result = query.getResultList();,字符串函数,EJB3.0 QL中定义的字符串函数包括:,CONCAT字符串拼接。 SUBSTRING字符串截取。 TRIM 去掉空格。 LOWER转换成小写
19、。 UPPER转换成大写。 LENGTH 获取字符串长度。 LOCATE 字符串定位。,如以下语句,查询所有人员,只取姓名的前三个字符: Query query = em.createQuery(“select p.personid, substring(p.name,1,3) from Person as p“);,计算函数,EJB3.0 QL中定义的计算函数包括 :, ABS绝对值 SQRT平方根 MOD取余数 SIZE取集合的数量,如以下语句,查询所有Order的订单号及其订单项的数量: Query query = em.createQuery(“select o.orderid, si
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 企业级 开发 QL 语言
链接地址:https://www.31doc.com/p-2593886.html