EJB QL中富有大量的查询语句并且基本上能符合你的绝大多数的查询需求.有时,你想要使用特定厂商提供的数据库上的专有能力.
实体管理服务提供了一个方法来建立原生的SQL查询并且映射他们到你的对象上.原生查询能反回实体,栏位值,或者两者的组合.EntityManager接口有三种方法来建立原生查询:一种返回标量值,一种是返回实体类型,最后一种是定义一个复杂的结果集,它能映射到多个实体的混合和标量值.
你可以进行JDBC的连接通过javax.sql.DataSource,使用@Resource注入和执行你的SQL语句.要意识到你所做的改变不会被当前的持久化上下文所反映.
标量原生查询
Query createNativeQuery(String sql)
这将建立一个原生查询返回一个标量结果.它需要一个参数:你的原生SQL.它执行并且返回结果集同EJB QL相同的形式,返回标量值.
简单的实体原生查询
Query createNativeQuery(String sql, Class entityClass)
一个简单的原生查询通过一个SQL语句和隐式的映像到一个实体,映射元数据为基础的一个实体.它认为原生查询的结果集中的栏将完全匹配实体的O/R映射.原生SQL查询的映射实体的确定通过entityClass 参数:
Query query = manager.createNativeQuery(
"SELECT p.phone_PK, p.phone_number, p.type
FROM PHONE AS p", Phone.class
);
实体的所有属性被列出.
复杂的原生查询
这个实体管理方法允许你有一个复杂的映射为原生SQL.你可以同时返回多个实体和标量栏.mappingName 参数参考@javax.persistence.SqlResultSetMapping定义.这个批注用来定义一个怎能样查询原生结果的钓子到O/R模型.如果返回的栏位名与批注映射的属性不匹配,你可以提代一个字段到栏位的映射为他们,使用@javax.persistence.FieldResult :
package javax.persistence;
public @interface SqlResultSetMapping {
String name( );
EntityResult[] entities( ) default {};
ColumnResult[] columns( ) default {};
}
public @interface EntityResult {
Class entityClass( );
FieldResult[] fields( ) default {};
String discriminatorColumn( ) default "";
}
public @interface FieldResult {
String name( );
String column( );
}
public @interface ColumnResult {
String name( );
}
让我们做一系列的例子表示这会如何工作.
使用多个实体的原生查询
@Entity
@SqlResultSetMapping(name="customerAndCreditCardMapping",
entities={@EntityResult(entityClass=Customer.class),
@EntityResult(entityClass=CreditCard.class,
fields={@FieldResult(name="id",
column="CC_ID"),
@FieldResult(name="number",
column="number")}
)})
public class Customer {...}
// execution code
{
Query query = manager.createNativeQuery(
"SELECT c.id, c.firstName, cc.id As CC_ID,
cc.number" +
"FROM CUST_TABLE c, CREDIT_CARD_TABLE cc" +
"WHERE c.credit_card_id = cc.id",
"customerAndCreditCardMapping");
}
因为结果集返回多个实体类型,我们必需使用一个@SqlResultSetMapping.这个批注可以被放在一个实体类或方法上.entities( )属性用来设置@EntityResult批注组成的队列.每一个@EntityResult注释指定将要通过原生SQL查询返回的实体.
@javax.persistence.FieldResult注释用来明确查询中与实体属性对应的映射栏位.@FieldResult批注的name()属性标识实体组件的属性, column( ) 属性标识通过原生查询返回的结果集栏位.
在这个例子中,我们需要指定@FieldResults为客户.原生查询为实体引用的每一个栏位.因为我们只查询CreditCard 实体的ID和number栏,@FieldResult批注需要被指定.在 CreditCard的@EntityResult批注中,fields()属性定义CreditCard 属性每次查询的映射.因为Customer和CreditCard主键栏有相同的名子,SQL查询需要辨别出他们的不同.cc.id As CC_ID这段SQL代码演示出这种标识.
我们也可以使用XML来表达:
<entity-mappings>
<sql-result-set-mapping name="customerAndCreditCardMapping">
<entity-result entity-class="com.titan.domain.Customer"/>
<entity-result entity-class="com.titan.domain.CreditCard"/>
<field-result name="id" column="CC_ID"/>
<field-result name="number" column="number"/>
</entity-result>
</sql-result-set-mapping>
</entity-mappings>
混合标量和实体结果
在我们的最终例子,显示一个实体和一个标量值的混合.我们写一个原生查询,来返回一个每次巡行由多少预定组成的巡行列表.
@SqlResultSetMapping(name="reservationCount",
entities=@EntityResult(name="com.titan.domain.Cruise",
fields=@FieldResult(name="id", column="id")),
columns=@ColumnResult(name="resCount"))
@Entity
public class Cruise {...}
{
Query query = manager.createNativeQuery(
"SELECT c.id, count(Reservation.id) as resCount
FROM Cruise c LEFT JOIN Reservation ON c.id = Reservation.CRUISE_ID
GROUP BY c.id",
"reservationCount");
}
reservationCount映射的定义,原生查询表现对一个巡航实体和一个所有巡航预定的数目的请求.@FieldResult批注标识c.id栏同Cruise实体相关联.@ColumnResult批注标识resCount栏同一个标量值.
等价的XML文件:
<entity-mappings>
<sql-result-set-mapping name="reservationCount">
<entity-result entity-class="com.titan.domain.Cruise">
<field-result name="id" column="id"/>
</entity-result>
<column-result name="resCount"/>
</sql-result-set-mapping>
</entity-mappings>
分享到:
相关推荐
- 执行 EJB3 查询语言 (EJB3QL) 查询。 **6.6.7 执行 SQL 操作 createNativeQuery()**: - 执行原生 SQL 查询。 **6.6.8 刷新实体 refresh()**: - 重新加载实体的状态。 **6.6.9 检测实体当前是否被管理中 ...
- `createQuery()`:执行EJB3QL查询 - `createNativeQuery()`:执行原生SQL查询 - `refresh()`:刷新实体状态 - `contains()`:检查实体是否处于托管状态 - `clear()`:清除所有托管实体 - `flush()`:同步...
- **执行查询**:利用createQuery()方法执行EJB3QL查询。 - **执行SQL操作**:通过createNativeQuery()执行原生SQL语句。 - **刷新实体**:使用refresh()方法刷新实体状态。 - **检查管理状态**:通过contains()方法...
- **查询操作**:包括EJB 3QL和原生SQL查询。 - **关系/对象映射**:详细介绍如何使用EJB 3.0来实现数据库表之间的各种关系映射,包括一对多、一对一和多对多关系。 - **参数查询**:介绍如何使用命名参数、位置...
- `createQuery()`: 执行EJB 3.0查询语言(EJB3QL)操作。 - `createNativeQuery()`: 执行原生SQL语句。 - `refresh()`: 刷新实体状态。 - `contains()`: 检查实体是否处于管理状态。 - `clear()`: 清空管理实体...
**EJB 3QL**(也称为JPQL)是一种面向对象的查询语言,用于执行查询。 1. **Query接口** - 提供了创建和执行查询的方法。 2. **简单查询** - 示例:`SELECT e FROM HelloWorld e WHERE e.message = 'Hello'` 3....
- `Query createQuery(String ejbqlString)`:创建 EJB QL 查询。 - `Query createNamedQuery(String name)`:创建命名查询。 - `Query createNativeQuery(String sql)`:创建原生 SQL 查询。 - `...
EJB 3.0提供了强大的查询功能,包括基于EJB Query Language (EJBQL)的查询、命名查询和原生SQL查询等,使得开发者可以根据需求选择最合适的查询方式。 通过以上介绍可以看出,EJB 3.0不仅提供了强大的企业级特性,...
基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以...
4. 掌握使用EJB3.0 QL进行参数查询。 **第三部分:框架** 框架是提高开发效率的关键,主要包括SSH(Struts、Spring、Hibernate)框架。学员需: 1. 理解事务与并发的概念,如悲观锁和乐观锁。 2. 精通SSH整合,包括...
1.4.4 Hibernate、EJB 3和JPA简介 1.5 小结 第2章 启动项目 2.1 启动Hibernate项目 2.1.1 选择开发过程 2.1.2 建立项目 2.1.3 Hibernate配置和启动 2.1.4 运行和测试应用程序 2.2...
- **HQL/EJBQL**:Hibernate Query Language (HQL) 和 EJB Query Language (EJBQL) 是Hibernate提供的查询语言,可以用来执行复杂的查询操作。 - **SQL查询**:通过`@NativeQuery`注解支持直接编写SQL查询语句。 ##...
EJBQL(Enterprise JavaBeans Query Language)是一种查询语言,允许开发者以面向对象的方式查询EJB实体Bean。它提供了一种声明式的数据访问方法,简化了复杂查询的编写。 #### 本地接口与远端接口的设计考虑 本地...
#### 七、EJB-QL:对象查询语言 ##### 7.1 大小写敏感 EJB-QL支持对关键字和标识符的大小写敏感性进行配置。 ##### 7.2 from子句 指定查询的目标实体。 以上内容概述了Hibernate EntityManager的主要特性和使用...
7. **查询语言**: Hibernate支持多种查询语言,包括原生SQL、HQL(Hibernate Query Language)、EJB QL、QBC(Query By Example)和QBE(Query By Example)。HQL更接近面向对象的查询,而EJB QL是Java EE的一部分,...
- **EJBQL/HQL 查询映射**:使用 `@NamedQuery` 注解来定义 HQL 查询。 - **本地化查询映射**:使用 `@SQL` 注解来定义原生 SQL 查询。 #### 五、Hibernate 独有的注解扩展 - **实体**:使用 `@Entity` 和 `@Table`...
5. **查询(Query)**:JPA提供QL(Java Persistence Query Language)进行查询,类似于HQL(Hibernate Query Language),也可以使用原生的SQL查询。 ### JPA注解 - `@Table`:指定实体对应的数据库表名。 - `@...
- **映射EJBQL/HQL查询:** 通过`@NamedQuery`注解来预定义HQL查询语句。 - **映射本地化查询:** 使用`@SQL`注解执行原生SQL查询。 #### 五、Hibernate独有的注解扩展 - **实体:** `@Entity`注解用于标记一个类为...