`
zhangfeilo
  • 浏览: 399757 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

JPA查询语言之EJBQL+JPQL

阅读更多

简单查询

返回所有Topic对象的记录:

SELECT t FROM Topic t

按条件查询Topic

SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = ?1

?1表示用位置标识参数,通过QuerysetParameter(1, "主题1")绑定参数。DISTINCT表示过滤重复数据。

如果以命名绑定数据,改成:

SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = :title

需要通过QuerysetParameter("title", "主题1")绑定参数。

 

关联查询

1.One To Many

返回PollOptions对应的PollTopic对象,可以:

SELECT DISTINCT p FROM PollTopic p, IN(p.options) o WHERE o.optionItem LIKE ?1

语法和SQL以及HQL都有很大的区别,它直接实体属性连接关联的实体,通过PollTopicoptions属性关联到PollOption实体上。

该查询语句的另外两种等价写法分别是:

SELECT DISTINCT p FROM PollTopic p JOIN p.options o WHERE o.optionItem LIKE ?1

SELECT DISTINCT p FROM PollTopic p WHERE p.options.optionItem LIKE ?1

 

2.Many To One

希望查询某一个调查主题下的所示调查项,可以:

SELECT p FROM PollOption p JOIN p.pollTopic t WHERE t.topicId = :topicId

 

关系操作符

空值比较符:is nullis not null is emptyis not empty

范围比较符:BETWEEN..AND>>= <<=<>

 

子查询

支持EXISTSALLANY。如查询出拥有6个以上选项的调查主题:

SELECT t FROM PollTopic t WHERE (SELECT COUNT(o) FROM t.options o) > 6

 

可用函数

     CONCAT(String, String):合并字段串;

LENGTH(String):求字段串的长度;

LOCATE(String, String [, start]):查询字段串的函数,第一个参数为需要查询的字段串,看它在出现在第二个参数字符串的哪个位置,start表示从哪个位置开始查找,返回查 找到的位置,没有找到返回0。如LOCATE ('b1','a1b1c1',1)返回为3

SUBSTRING(String, start, length):子字段串函数;

TRIM([[LEADING|TRAILING|BOTH] char) FROM] (String):将字段串前后的特殊字符去除,可以通过选择决定具体的去除位置和字符;

LOWER(String):将字符串转为小写;

UPPER(String):将字符串转为大写。

ABS(number):求绝对值;

MOD(int, int):求模;

SQRT(double):求平方;

SIZE(Collection):求集合大小。

 

更改删除语句

可用EntityManagerJPA查询语言进行实体的更新、删除操作。

1.更新:

UPDATE PollOption p SET p.optionItem = :value WHERE p.optionId = :optionId

2.删除:

DELETE FROM PollOption p WHERE p.optionId = :optioned

之后使用Query接口的executeUpdate()方法执行更新、删除。

 

排序和分组

排序:Order by 属性名 desc [asc]

聚集函数:

AVG:平均值,返回double

MAX:最大值;

MIN:最小值;

SUM:累加和;

COUNT:集合数

通过HAVING对聚集结果进行条件过滤:

 

SELECT COUNT(p),p.pollTopic.topicId

FROM PollOption p GROUP BY p.pollTopic.topicId HAVING

p.pollTopic.topicId IN(1,2,3)

 

如何取得结果?注意使用聚集函数不是返回一个对应的实体List,而是返回一个List<Object>,以下是返回上面查询的结果(使用Object数组):

List list= query.list();

Object obj[] = null;//声明对象数组

Integer count = null;

Integer topicId = null;

for(int i=0;i<list.size();i++){

    obj = (Object[]) list.get(i);

    count = (Integer) obj[0];

    topicId = (Integer) obj[1];

    //逻辑操作

}

 

 

select name ,age from user; //原生SQL语句

select u.name,u.age from User u; //JPQL语句

select u from User u; //JPQL语句

SQL语句是在数据库空间中对字段,列,行进行操作

JPQL语句是在EJB实体空间中面向对象,属性进行操作

JPQL必须由JPA的JPQL解析器解析为SQL才能执行,必须先获取Query对象

参数查询

1命名参数查询

entityManager.createQuery("select u from User u where u.age=:param");

query.setParameter("param",24);

List<User> result=(List<User>)query.getResultList();

2位置参数查询

"select u from User u where u.age=?1"

query.setParameter(1,24);

3实体参数(JPQL中除了基本类型外,还可以是对象类型)

"select u from User u where u.person=?1"

Person p=new Person();

p.setId(1);

query.setParameter(1,p);

JPQL运算符

算术运算符 + - * /

关系运算符 = > < >= <= <>

逻辑运算符 between ,like , in , is null,is empty,member of,not ,and ,or

1 not

"select u from User u where not(u.cityid=?1)"

2 between和sql中一样

3 in 在给定的值列表中查询

"select u from User u where u.cityid in(1,2,3)"

4 like ( _ 表示一个字符,%表示任意数量字符 )

xxxx where u.name like ' 张% '

5 is null (实体的属性是否为空,即实体属性映射的字段是否为空)

"select u from User u where u.cityid is null"

6 is empty (与is null 不同的是,它针对实体的集合属性 内有没有元素。

虽然集合对象是存在的,但是集合内没有元素)

select o from Order o where o.orderItems is empty

条件查询

1排序查询 asc升序 desc降序

order by p.age desc,p.birthday asc

2聚合函数查询

avg() 平均值,返回Double count()返回Long max() min() sum()

以上除了count外其它的函数的参数对应的是 单个的字段,即属性而不是对象

HAVING和WHERE的区别。一个是先分组,再对组进行筛选;一个是先筛选,然后对筛选后的记录进行分组。

构造器查询

"select new com.jsun.Person(p.name) from Person p"

Person有这个构造器时,即Person(String name),成功返回对象。

关联查询(实际工作中仍然会有这种需求)

left join 允许右边实体表达式的实体为空,这里的实体指 集合属性

inner join 右边必须存在

"select o from Order o inner join o.orderItems"

默认查询中,集合属性是懒加载的。只有用的时候JPA才会再发SQL语句

在查询的时候我们希望一次全抓取出来怎么办?用 fetch

(其实left join和inner join在这里使用主要是为了配合fetch,一次抓取,因为默认的是懒加载)

"select o from Order oinner join fetcho.orderItems"

排除相同记录DISTINCT

select distinct o from Order o

(还可以配合聚合函数使用)

如 select count(distinct o) from Order o

JPQL内置函数

字符串函数

concat(str1,str2)

substring(string,position,length)

trim( [leading | trailing | both] sub_str from str)

upper(str)

lower(str)

length(str)

locate(searchString,initPosition)

日期,时间函数

CURRENT_DATE //返回当前日期(这是数据库端的时间)

CURRENT_TIME //返回当前时间

CURRENT_TIMESTAMP //返回当前日期时间

数学函数

ABS(number) //绝对值

SQRT(number) //平方根

MOD(num,div)//取模

SIZE(collection) //返回集合中元素的数量

如:select o from Order o where size(o.items)>10

使用子查询

xxxx in(子查询)

xxxx not in(子查询)

exists(子查询)

notexists(子查询 ) exists存在的意思 即子查询的结果不为空就是存在

分页查询

用到了query接口的两个方法

setMaxResults(int) //设置获取多少条记录

和setFirstResult(int)//结果集开始的索引,索引默认从0开始

以上两个方法都返回Query对象所以可以组成方法链

query.setMaxResults(max).setFirstResult(index).getResultList()

批量操作(批量更新和批量删除)

建议将所有批量操作与不连续的事务隔离开,

批量操作可能造成受管实体与数据库的不一致

原生SQL查询与调用存储过程(EJB3.0不支持以OUT参数的形式返回的存储过程)

Query query=entityManager.createNativeQuery(" {call pro_1(?)} ");

query.setParameter(1,"jsun");

//无返回值存储过程

query.executeUpdate();

//返回单个值的存储过程

String result=(String)query.getSingleResult();

//返回全部列的存储过程

List<User> results=(List<User>)query.getResultList();

//返回部分列的存储过程

List<Object[]> results=(List<Object[]>)query.getResultList();

for(Object[] row:results){

row[0],row[1]

}

0
1
分享到:
评论

相关推荐

    EJB3查询JPQL解析

    Java Enterprise Edition (Java EE) 中的EJB 3.0引入了Java持久性查询语言(JPQL),这是一种专为访问和导航Java应用程序中的实体实例设计的语言。JPQL是对早期EJB QL的扩展和改进,它允许开发者以面向对象的方式来...

    EJB3.0查询语句JPQL用法

    Java企业版(Java EE)中的EJB3.0引入了一种新的查询语言,即JPQL(Java Persistence Query Language)。JPQL是EJB2中EJB QL的扩展,旨在简化Java应用程序对持久化实体的访问和操作。本文将深入探讨JPQL的基本概念、...

    EJB_JPQL语言详解

    **JPQL(Java Persistence Query Language)** 是EJB 3.0引入的一种查询语言,专门用于在对象/关系映射(ORM)框架如JPA(Java Persistence API)中进行数据查询。JPQL与SQL类似,但它是面向对象的,允许开发者以类...

    <ejb-ql> 标记

    EJB规范提供了一种强大的查询语言,即EJB查询语言(EJB-QL),它类似于SQL,用于检索和操作EJB实体bean的实例。EJB-QL允许开发者以面向对象的方式表达查询,从而在业务逻辑中更加灵活地处理数据。 **EJB-QL基础** ...

    经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发-利用JMS实现企业消息处理

    EJB 3.0引入了无状态会话bean、有状态会话bean、实体bean(与JPA结合使用)等,以及依赖注入和查询语言JPAQL,大大降低了学习曲线和开发成本。 JPA是Java EE中的对象关系映射(ORM)标准,它为Java开发者提供了一种...

    基于JPQL实现纯SQL语句方法详解

    基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以...

    enterprise javabean 的cmp

    5. **查询语言(QL)**:EJB 2.0中的CMP支持Entity Bean Query Language (EJB QL),这是一种面向对象的查询语言,类似于SQL,但专为EJB设计。EJB QL允许开发者执行复杂的查询,获取和更新数据库中的数据。 6. **...

    EJB3.0相关

    JPA与EJB查询语言(EJB QL) EJB 3.0 中的JPA提供了JPQL(Java Persistence Query Language),一种面向对象的查询语言,用于查询持久化实体。JPQL与SQL类似,但更专注于对象模型而不是关系模型。 ### 8. 测试与...

    EJB3入门

    EJB3引入了JPQL(Java Persistence Query Language),一种面向对象的查询语言,允许开发者对数据库进行复杂的查询操作,类似于SQL但更为面向对象。 5. **依赖注入(Dependency Injection)** EJB3支持依赖注入...

    ejb实体bean实例

    3. **查询语言(JPA QL)**:除了基本的CRUD操作,还可以使用JPA的查询语言(JPQL)执行更复杂的SQL查询,如`SELECT e FROM EntityBean e WHERE e.property = :value`。 ### 四、EJB实体Bean的生命周期管理 EJB...

    一个关于EJB的实验报告........

    EJB还支持EJB查询语言(EJB QL)和Java Persistence Query Language(JPQL)进行数据查询。 ### 6. EJB的优势与挑战 EJB提供了强大的企业级功能,如事务管理、安全性、性能优化等,但同时也需要较高的学习曲线和...

    EJB 3实例教程(最新版)

    5. **查询语言JPA QL**:EJB 3引入了JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL但用于操作对象和实体。 ### 三、EJB 3的组件类型 1. **实体Bean(Entity Beans)**:代表数据库...

    JBoss下EJB3.0实例教程(黎活明)

    5. **查询语言JPA QL**:EJB 3.0提供了JPQL(Java Persistence Query Language),类似于SQL,用于查询持久化实体。 教程可能涵盖以下内容: 1. **环境搭建**:包括下载和安装JBoss服务器,配置开发环境,如JDK和...

    EJB3.0实例教程

    7. **查询语言JPA QL**:EJB3.0提供了JPQL(Java Persistence Query Language),这是一种面向对象的查询语言,类似于SQL,但用于检索和操作持久化对象。 8. **异步方法**:EJB3.0允许定义异步方法,通过`@...

    EJB3.0学习心得

    - **查询语言**: EJB 3.0 引入了 EJB-QL 和 JPA 的 JPQL,支持更为丰富的查询表达式,包括 JOIN、GROUP BY、HAVING 等 SQL 特性。 **5. 拦截器** - **拦截器**: EJB 3.0 支持在方法调用前后执行拦截器,用于处理...

    ejb3.0src.rar_ejb

    5. **查询语言JPA QL**:EJB 3.0引入了JPQL(Java Persistence Query Language),它是SQL的面向对象版本,允许开发者以面向对象的方式执行数据库查询。 6. **无状态会话bean和有状态会话bean**:`@Stateless` bean...

    ejb3的几个例子,谢谢

    6. **查询语言JPA QL**:EJB 3.0引入了JPQL(Java Persistence Query Language),这是一种面向对象的查询语言,用于检索和操作持久化实体。`@NamedQuery`和`@NamedNativeQuery`注解允许开发者预定义查询,提高了...

    EJB入门及高级特性

    - **查询语言**:CMP通常使用EJB QL(Entity Bean Query Language),而JPA(Java Persistence API)引入了更强大的JPQL。 **4. Time Service** Java EE提供定时服务(Timer Service),允许EJB在预设的时间执行...

Global site tag (gtag.js) - Google Analytics