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