MyEclipse6Java开发中文教程 remove()这些方法时,更新并不会立刻同步到数据库中,直到容器决定刷新到数据库 中时才会执行,我们可以调用fush0强制更新 createQuery0-根据 JPA QL定义查询对象 createNativeQuery0-允许开发人员根据特定数据库的SQL语法来进行查询操作,只 有 JPA QL不能满足要求时才使用它 createNamedQueryo-根据实体中标注的命名查询创建查询对象,大家还记得前面所 提到的@ Named Quene标注嘛?彼处的name属性值则对应着此方法的参数 merge( Object)-将一个 detached的实体持久化到数据库中,并转换为 managed 状态 close0-关闭实体管理器,并且会尝试更新所有数据 下面是一些示例的代码 ∥保存数据 HelloEntity Bean hello new HelloEntity Bean( 1, too") EntityTransaction trans entity Manager. getTransaction( trans. begin( ∥持久化he|o,在此操作之前helo的状态为neW entity Manager persist( hello ∥这时heo的状态变为 managed trans. commit( entity Manager. close(, ∥这时heow的状态变为 detached ∥获取 Entity 如果知道 Entity的唯一标符,我们可以用fnd(0方法来获得Enty Father father= manager. find( Father. class, new integer( 1)), ∥由干JDK15支持自动转型,也可以如下使用 Father father= manager. find( Father. class, 1); 或者可以用Enty名字作为查找。但无法利用JDK1.5的自动转型功能 需要使用对象作为查找主键,并需要对获得Enty进行转型 Father father=( Father) manager. find(" com. redsof samples Father, new Integer(f 1)) ∥更新Enty 对Enty的更新必须在事务内完成。和 persist中一样,关系元数据的 cascade属性是 否集联删除有影响。 刘长炯著
MyEclipse 6 Java 开发中文教程 16 刘长炯著 remove( )这些方法时,更新并不会立刻同步到数据库中,直到容器决定刷新到数据库 中时才会执行,我们可以调用 flush()强制更新 z createQuery() – 根据 JPA QL 定义查询对象 z createNativeQuery() – 允许开发人员根据特定数据库的 SQL 语法来进行查询操作,只 有 JPA QL 不能满足要求时才使用它 z createNamedQuery() – 根据实体中标注的命名查询创建查询对象,大家还记得前面所 提到的@NamedQuerie 标注嘛?彼处的 name 属性值则对应着此方法的参数。 z merge(Object) – 将一个 detached 的实体持久化到数据库中,并转换为 managed 状态 z close() – 关闭实体管理器,并且会尝试更新所有数据 下面是一些示例的代码: // 保存数据 HelloEntityBean hello = new HelloEntityBean( 1, "foo" ); EntityTransaction trans = entityManager.getTransaction(); trans.begin(); // 持久化 hello,在此操作之前 hello 的状态为 new entityManager.persist( hello ); // 这时 hello 的状态变为 managed trans.commit(); entityManager.close(); // 这时 hellow 的状态变为 detached. // 获取 Entity 如果知道 Entity 的唯一标示符,我们可以用 find()方法来获得 Entity。 Father father = manager.find( Father.class, new Integer( 1 ) ); // 由于 JDK1.5 支持自动转型,也可以如下使用 Father father = manager.find( Father.class, 1 ); /* * 或者,可以用 Entity 名字作为查找。但无法利用 JDK 1.5 的自动转型功能, * 需要使用对象作为查找主键,并需要对获得 Entity 进行转型 */ Father father = (Father)manager.find( "com.redsoft.samples.Father", new Integer( 1 ) ); // 更新 Entity 对 Entity 的更新必须在事务内完成。和 persist 中一样,关系元数据的 cascade 属性对是 否集联删除有影响
MyEclipse6Java开发中文教程 transaction begin( Father father= manager. find( Father. class, 1), ∥更新原始数据类型 father setName( "newName") ∥更新对象引用 Son newSon new Son( father. set Son( newSon ∥提交事务,刚才的更新同步到数据库 transaction commit( ∥删除Enty 对Enty的删除必须在事务内完成。 transaction begin( Father father= manager. find( Father. class, 1); ∥如果 atherton@ One toone的 cascade= Cascade Type. ALL,在删除 ather时 候,也会把son删除 ∥把 cascade属性设为 cascade= Cascade Type. REMOVE有同样的效果 manager. remove( father ∥提交事务,刚才的更新同步到数据库 transaction commit B离合 Detach/Merge) ∥ Entity能离 Entity Manager,避免长时间保持 EntityManager打开占用资源和可以在 不同的JWM之传递 Entity Entity Manager entity Manager= emf. createEntity Manager Father father manager find( Father. class, 1); 当 entity Manger关闭的时候,当前被 entityManager管理的Entt都会自动的胧离 EntityManager,状态转变为 detached entity Manager. closed ∥脱离 Entity Manager后,我们仍然可以修改 Father的属性 ather setName( "newName"), ∥在稍后的,我们可以将向her重新附和到一个新的或者原来的 EntityManager中 Entity Manager newEntity Manager= emf. createEntity Manager(; ∥附合( merge)需要在事务中进行 newEntityManager getTransaction( begin( newEntity Manager. merge( father) newEntity Manager. get Transaction( commit 刘长炯著
MyEclipse 6 Java 开发中文教程 17 刘长炯著 transaction.begin(); Father father = manager.find( Father.class, 1 ); // 更新原始数据类型 father.setName( "newName" ); // 更新对象引用 Son newSon = new Son(); father.setSon( newSon ); // 提交事务,刚才的更新同步到数据库 transaction.commit(); // 删除 Entity 对 Entity 的删除必须在事务内完成。 transaction.begin(); Father father = manager.find( Father.class, 1 ); // 如果 father/son 的@OneToOne 的 cascade=CascadeType.ALL,在删除 father 时 候,也会把 son 删除。 // 把 cascade 属性设为 cascade=CascadeType.REMOVE 有同样的效果。 manager.remove( father ); // 提交事务,刚才的更新同步到数据库 transaction.commit(); //脱离/附合(Detach/Merge) // Entity 能脱离 EntityManager,避免长时间保持 EntityManager 打开占用资源和可以在 不同的 JVM 之间传递 Entity EntityManager entityManager = emf.createEntityManager(); Father father = manager.find( Father.class, 1 ); // 当 entityManger 关闭的时候,当前被 entityManager 管理的 Entity 都会自动的脱离 EntityManager,状态转变为 detached entityManager.close(); // 脱离 EntityManager 后,我们仍然可以修改 Father 的属性 father.setName( "newName" ); // 在稍后的,我们可以将 father 重新附和到一个新的或者原来的 EntityManager 中 EntityManager newEntityManager = emf.createEntityManager(); // 附合( merge )需要在事务中进行 newEntityManager.getTransaction().begin(); newEntityManager.merge( father ); newEntityManager.getTransaction().commit();
MyEclipse6Java开发中文教程 13135 Query对象 最后需要提及的一个内容恐怕就是JPA中进行查询了,即 Query对象。JPA使用 javax. persistence Query接口代表一个查询实例,Quey实例由 EntityManager通过指定查 询语句构建。该接口拥有众多执行数据查询的接口方法,可以参考图13.7。下面对一些方 法略作简介 Object getsingle Resulto:执行 SELECT查询语句,并返回一个结果; List getResultListo:执行 SELECT查询语句,并返回多个结果; > Query setParameter( int position, Object value):通过参数位置号绑定查询语句中的参 数,如果查询语句使用了命令参数,则可以使用 Query setParameter(( String name Object value)方法绑定命名参数 Query setMaxResults( int maxResult):设置返回的最大结果数 Query set FirstResult(int firstResul:设置返回的结果开始下标。 int executeUpdateo:如果查询语句是新增、删除或更改的语句,通过该方法执行更新 操作; 如果读者和以前的 Hibernate中的 Query对象进行对比的话,会发现几乎没有任何的区 别,所以,以前进行分页的代码在这里仍然有效,大家可以参考722 Hibernate要点一节 的内容来了解如何分页。现在我们给读者列出一些简单查询的例子来 String queryString=" elect mode/ from User mode"∥这里给的是实体名 List resu= entityManager create Query(query String). getResultList(;∥普通查询 queryString=" select' from userTable"∥这里给的是表名 result=entity Manager. createNative Query(query String) getResultList( /SQL ifit D Query e getResultListO: List o getsingleResultO: Object ● executeUpdate(:int setMaxResults (int): Query setHint (String, Object): Que o setParameter (String, Object):Quer o setParameter (String, Date, TemporalType y o setParameter (String, Calendar, TemporalType): Query e setParameter (int, Object):Query e setParameter (int, Date, TemporalType): Query o setParameter (int, Calendar, TemporalType): Query o setFlushMode (FlushModeType):Query 13.7 Query对象方法列表 另外 JPA QL还支持参数查询,它和SQL中的参数查询类似。EJB3QL支持两种方式的 参数定义方式:命名参数和位置参数。在同一个查询中只允许使用一种参数定义方式。下面 就简单的做一些介绍。 命名参数 刘长炯著
MyEclipse 6 Java 开发中文教程 18 刘长炯著 13.1.3.5 Query 对象 最后需要提及的一个内容恐怕就是 JPA 中进行查询了,即 Query 对象。JPA 使用 javax.persistence.Query 接口代表一个查询实例,Query 实例由 EntityManager 通过指定查 询语句构建。该接口拥有众多执行数据查询的接口方法,可以参考图 13.7。下面对一些方 法略作简介: ¾ Object getSingleResult():执行 SELECT 查询语句,并返回一个结果; ¾ List getResultList() :执行 SELECT 查询语句,并返回多个结果; ¾ Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的参 数,如果查询语句使用了命令参数,则可以使用 Query setParameter(String name, Object value)方法绑定命名参数; ¾ Query setMaxResults(int maxResult):设置返回的最大结果数; ¾ Query setFirstResult(int firstResult):设置返回的结果开始下标。 ¾ int executeUpdate():如果查询语句是新增、删除或更改的语句,通过该方法执行更新 操作; 如果读者和以前的 Hibernate 中的 Query 对象进行对比的话,会发现几乎没有任何的区 别,所以,以前进行分页的代码在这里仍然有效,大家可以参考 7.2.2 Hibernate 要点一节 的内容来了解如何分页。现在我们给读者列出一些简单查询的例子来: String queryString = "select model from User model";//这里给的是实体名 List result = entityManager.createQuery(queryString).getResultList();//普通查询 queryString = “select * from UserTable”;// 这里给的是表名 result = entityManager.createNativeQuery(queryString).getResultList();//SQL 查询 图 13.7 Query 对象方法列表 另外 JPA QL 还支持参数查询,它和 SQL 中的参数查询类似。EJB3 QL 支持两种方式的 参数定义方式: 命名参数和位置参数。在同一个查询中只允许使用一种参数定义方式。下面 就简单的做一些介绍。 命名参数:
MyEclipse6Java开发中文教程 Query query =entity Manager. create Query( " select o from Order o where o id ∥设置查询中的参数 query setParameter( myld, 2); ∥可以使用多个参数 Query query entityManager create Query( " select o from Order o where o id myld and ocustomer =.customerName"). ∥设置查询中的参数 query setParameter( "myld, 2 ), query setParameter( "customerName, foo") 注意:不允许在同一个查询中使用两个相同名字的命名参数 位置参数: Query query entityManager create Query( "select o from Order o where oid ?1"); ∥设置查询中的参数 query setParameter((,2)∥1表示第一个参数,2是参数的值 ∥或者 Query query entityManager create Query( " select o from Order o where o id ?12.setParameter( 1, 2 ∥可以使用多个参数 Query query entityManager create Query("select o from Order o where o id=?1 and o customer=?2 ) ∥设置查询中的参数 query setParameter( 1, 2 query setParameter( 2, Too") 一般我们建议使用命名参数,比较便于阅读和修改,尤其是参数比较多的时候,使用下 标来定位显然是要把人累死。 13136JPA查询语言( JPA QL)简介 现在新推出的JPA查询语言( JPA QL)已经正式和EJB3查询语言(EJB3QL)进 行了区分。JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查 询语句,可以看成是 Hibernate HQL的等价物。在这里我们不打算做100%的介绍,因为 SUN的官方文档关于它有足足几十页那么多的内容,仅列出部分内容供大家作一些了解。 简单的查询 你可以使用以下语句返回所有Topc对象的记录: SELECT FROM Topic t t表示 Topic的别名,在 Topic t是 Topic As t的缩写。 如果需要按条件査询 Topic,我们可以使用 SELECT DISTINCTt FROM Topic t WHERE t. topicTitle=?1 通过 WHERE指定查询条件,?1表示用位置标识参数,尔后,我们可以通过 Query的 刘长炯著
MyEclipse 6 Java 开发中文教程 19 刘长炯著 Query query = entityManager.createQuery( "select o from Order o where o.id = :myId"); // 设置查询中的参数 query.setParameter( "myId", 2 ); // 可以使用多个参数 Query query = entityManager.createQuery( "select o from Order o where o.id = :myId and o.customer = :customerName" ); // 设置查询中的参数 query.setParameter( "myId", 2 ); query.setParameter( "customerName", "foo" ); 注意:不允许在同一个查询中使用两个相同名字的命名参数。 位置参数: Query query = entityManager.createQuery( "select o from Order o where o.id = ?1"); // 设置查询中的参数 query.setParameter( 1, 2 );// 1 表示第一个参数,2 是参数的值 //或者 Query query = entityManager.createQuery( "select o from Order o where o.id = ?1").setParameter( 1, 2 ); // 可以使用多个参数 Query query = entityManager.createQuery( "select o from Order o where o.id = ?1 and o.customer = ?2" ); // 设置查询中的参数 query.setParameter( 1, 2 ); query.setParameter( 2, "foo" ); 一般我们建议使用命名参数,比较便于阅读和修改,尤其是参数比较多的时候,使用下 标来定位显然是要把人累死。 13.1.3.6 JPA 查询语言(JPA QL)简介 现在新推出的 JPA 查询语言(JPA QL)已经正式和 EJB 3 查询语言(EJB 3 QL)进 行了区分。JPA 的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查 询语句,可以看成是 Hibernate HQL 的等价物。 在这里我们不打算做 100%的介绍,因为 SUN 的官方文档关于它有足足几十页那么多的内容,仅列出部分内容供大家作一些了解。 简单的查询 : 你可以使用以下语句返回所有 Topic 对象的记录: SELECT t FROM Topic t t 表示 Topic 的别名,在 Topic t 是 Topic AS t 的缩写。 如果需要按条件查询 Topic,我们可以使用: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = ?1 通过 WHERE 指定查询条件,?1 表示用位置标识参数,尔后,我们可以通过 Query 的
MyEclipse6Jaa开发中文教程 setParameter(1,"主题1)绑定参数。而D| STINCT表示过滤掉重复的数据。 如果需要以命名绑定绑定数据,可以改成以下的方式 SELECT DISTINCTt FROM Topic t WHERE t. topicTitle = title 这时,需要通过 Query的 setParameter("title","主题1)绑定参数。 使用其它的关系操作符 使用空值比较符,比如查询附件不空的所有帖子对象 SELECT p FROM Post p WHERE p. postAttach /S NOT NULL 范围比较符包括 BETWEEN.AND和>、>=、<、<、<>这些操作符。比如下面的语句查 询浏览次数在100到200之间的所有论坛主题: SELECTt FROM Topic t WHERE t topic VieWs BETWEEN 100 AND 200 集合关系操作符 和其它实体是 One-to-Many或 Many-to-Many关系的实体,通过集合引用关联的实体,我 们可以通过集合关系操作符进行数据查询。下面的语句返回所有没有选项的调查论坛的主 SELECTt FROM PollTopic t WHERE t options /S EMPTY 我们还可以通过判断元素是否在集合中进行查询: SELECTt FROM PollTopic t WHERE option MEMBER OF t options 这里参数必须绑定一个 PollOption的对象,JPA会自动将其转换为主键比较的SQL语句。 子查询 JPA可以进行子查询,并支持几个常见的子查询函数: EXISTS、ALL、ANY。如下面的语 句查询出拥有6个以上选项的调查主题 SELECTt FROM Poll Topic t WHERE (SELECT COUNT(o) FROM t options o)>6 可用函数 JPA查询支持一些常见的函数,其中可用的字符串操作函数有 ◆ CONCAT( String, String):合并字段串 ◆ LENGTH( String):求字段串的长度 ◆ LOCATE(String, String[ start)查询字段串的函数,第一个参数为需要查询的字段串 看它在出现在第二个参数字符串的哪个位置,stat表示从哪个位置开始查找,返回查找到 的位置,没有找到返回0。如 LOCATE(b1a1b1c1;1)返回为3 ◆ SUBSTR|NG( String, start, length):子字段串函数; ◆TRM( LEADINGTRAILING BOTH]char)FROM]( String):将字段串前后的特殊字符去 除,可以通过选择决定具体的去除位置和字符 ◆ LOWER(Srng):将字符串转为小写 ◆ UPPER( String):将字符串转为大写。 数字操作函数有 ◆ABS( number):求绝对值函数 ◆MoD(nt,int):求模的函数 ◆SQRT( double):求平方函数 ◆SzE( Collection):求集合大小函数。 更新语句 可以用 Entity Manager进行实体的更新操作,也可以通过查询语言执行数据表的字段更新, 记录删除的操作: 下面的语句将某一个调查选项更新为新的值: /PDATE PollOption p SETp. optionltem=: value WHERE p. optionld 刘长炯著
MyEclipse 6 Java 开发中文教程 20 刘长炯著 setParameter(1, "主题 1")绑定参数。而 DISTINCT 表示过滤掉重复的数据。 如果需要以命名绑定绑定数据,可以改成以下的方式: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = :title 这时,需要通过 Query 的 setParameter("title", "主题 1")绑定参数。 使用其它的关系操作符 使用空值比较符,比如查询附件不空的所有帖子对象: SELECT p FROM Post p WHERE p.postAttach IS NOT NULL 范围比较符包括 BETWEEN..AND 和>、>= 、<、<=、<>这些操作符。比如下面的语句查 询浏览次数在 100 到 200 之间的所有论坛主题: SELECT t FROM Topic t WHERE t.topicViews BETWEEN 100 AND 200 集合关系操作符 和其它实体是 One-to-Many 或 Many-to-Many 关系的实体,通过集合引用关联的实体,我 们可以通过集合关系操作符进行数据查询。下面的语句返回所有没有选项的调查论坛的主 题: SELECT t FROM PollTopic t WHERE t.options IS EMPTY 我们还可以通过判断元素是否在集合中进行查询: SELECT t FROM PollTopic t WHERE :option MEMBER OF t.options 这里参数必须绑定一个 PollOption 的对象,JPA 会自动将其转换为主键比较的 SQL 语句。 子查询 JPA 可以进行子查询,并支持几个常见的子查询函数:EXISTS、ALL、ANY。如下面的语 句查询出拥有 6 个以上选项的调查主题: SELECT t FROM PollTopic t WHERE (SELECT COUNT(o) FROM t.options o) > 6 可用函数 JPA 查询支持一些常见的函数,其中可用的字符串操作函数有: ◆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):求集合大小函数。 更新语句 可以用 EntityManager 进行实体的更新操作,也可以通过查询语言执行数据表的字段更新, 记录删除的操作: 下面的语句将某一个调查选项更新为新的值: UPDATE PollOption p SET p.optionItem = :value WHERE p.optionId = :optionId