当前位置: 首页 > news >正文

广西壮族自治区网站建设_网站建设公司_留言板_seo优化

做网站常用工具,建站小程序,十大货源网站大全,wordpress好用的主体当您使用JPA时-有时-JPQL无法解决问题#xff0c;您将不得不使用本机SQL。 从一开始#xff0c;像Hibernate这样的ORM就为这些情况保留了一个开放的“后门”#xff0c;并为Spring的JdbcTemplate #xff0c; Apache DbUtils或jOOQ提供了类似的API#xff0c;用于纯SQL 。… 当您使用JPA时-有时-JPQL无法解决问题您将不得不使用本机SQL。 从一开始像Hibernate这样的ORM就为这些情况保留了一个开放的“后门”并为Spring的JdbcTemplate Apache DbUtils或jOOQ提供了类似的API用于纯SQL 。 这很有用因为您可以继续将ORM用作数据库交互的单个入口点。 但是使用字符串连接编写复杂的动态SQL既繁琐又容易出错并且是SQL注入漏洞的门户。 使用像jOOQ这样的类型安全的API会非常有用但是您可能会发现仅在10-15个本机查询中就很难在同一应用程序中维护两个不同的连接事务和会话模型。 但事实是 您可以将jOOQ用于JPA本机查询 确实如此 有几种方法可以实现此目的。 提取元组即Object [] 最简单的方法将不会利用JPA的任何高级功能而只是为您获取JPA的本机Object[]形式的元组。 假设这个简单的实用方法 public static ListObject[] nativeQuery(EntityManager em, org.jooq.Query query ) {// Extract the SQL statement from the jOOQ query:Query result em.createNativeQuery(query.getSQL());// Extract the bind values from the jOOQ query:ListObject values query.getBindValues();for (int i 0; i values.size(); i) {result.setParameter(i 1, values.get(i));}return result.getResultList(); } 使用API 这就是您以最简单的形式桥接这两个API所需要的以通过EntityManager运行“复杂”查询 ListObject[] books nativeQuery(em, DSL.using(configuration).select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, BOOK.TITLE).from(AUTHOR).join(BOOK).on(AUTHOR.ID.eq(BOOK.AUTHOR_ID)).orderBy(BOOK.ID));books.forEach((Object[] book) - System.out.println(book[0] book[1] wrote book[2])); 同意的结果中没有很多类型安全性因为我们只得到一个Object[] 。 我们期待着将来支持Scala或Ceylon之类的元组甚至记录类型的Java。 因此更好的解决方案可能是 获取实体 假设您具有以下非常简单的实体 Entity Table(name book) public class Book {Idpublic int id;Column(name title)public String title;ManyToOnepublic Author author; }Entity Table(name author) public class Author {Idpublic int id;Column(name first_name)public String firstName;Column(name last_name)public String lastName;OneToMany(mappedBy author)public SetBook books; } 并假设我们将添加一个附加的实用程序方法该方法还将Class引用传递给EntityManager public static E ListE nativeQuery(EntityManager em, org.jooq.Query query,ClassE type ) {// Extract the SQL statement from the jOOQ query:Query result em.createNativeQuery(query.getSQL(), type);// Extract the bind values from the jOOQ query:ListObject values query.getBindValues();for (int i 0; i values.size(); i) {result.setParameter(i 1, values.get(i));}// Theres an unsafe cast here, but we can be sure// that well get the right type from JPAreturn result.getResultList(); } 使用API 现在这相当灵活只需将jOOQ查询放入该API并从中获取JPA实体-两者兼有因为您可以轻松地从获取的实体中添加/删除嵌套集合就好像您是通过JPQL来获取它们一样 ListAuthor authors nativeQuery(em,DSL.using(configuration).select().from(AUTHOR).orderBy(AUTHOR.ID) , Author.class); // This is our entity class hereauthors.forEach(author - {System.out.println(author.firstName author.lastName wrote);books.forEach(book - {System.out.println( book.title);// Manipulate the entities here. Your// changes will be persistent!}); });获取实体结果 如果您比较敢于冒险并且对注释有一种奇怪的喜好 或者只是想在休假前给同事开个玩笑还可以使用JPA的javax.persistence.SqlResultSetMapping 。 想象以下映射声明 SqlResultSetMapping(name bookmapping,entities {EntityResult(entityClass Book.class,fields {FieldResult(name id, column b_id),FieldResult(name title, column b_title),FieldResult(name author, column b_author_id)}),EntityResult(entityClass Author.class,fields {FieldResult(name id, column a_id),FieldResult(name firstName, column a_first_name),FieldResult(name lastName, column a_last_name)})} ) 本质上以上声明将数据库列 SqlResultSetMapping - entities - EntityResult - fields - FieldResult - column 映射到实体及其相应属性。 使用这种强大的技术您可以从任何类型的SQL查询结果中生成实体结果。 同样我们将创建一个小的实用工具方法 public static E ListE nativeQuery(EntityManager em, org.jooq.Query query,String resultSetMapping ) {// Extract the SQL statement from the jOOQ query:Query result em.createNativeQuery(query.getSQL(), resultSetMapping);// Extract the bind values from the jOOQ query:ListObject values query.getBindValues();for (int i 0; i values.size(); i) {result.setParameter(i 1, values.get(i));}// This implicit cast is a lie, but lets risk itreturn result.getResultList(); } 请注意 上面的API使用了anti-pattern 在这种情况下可以使用因为JPA首先不是类型安全的API。 使用API 现在再次您可以通过上述API将类型安全的jOOQ查询传递给EntityManager 并传递SqlResultSetMapping的名称如下SqlResultSetMapping ListObject[] result nativeQuery(em,DSL.using(configuration.select(AUTHOR.ID.as(a_id),AUTHOR.FIRST_NAME.as(a_first_name),AUTHOR.LAST_NAME.as(a_last_name),BOOK.ID.as(b_id),BOOK.AUTHOR_ID.as(b_author_id),BOOK.TITLE.as(b_title)).from(AUTHOR).join(BOOK).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)).orderBy(BOOK.ID)), bookmapping // The name of the SqlResultSetMapping );result.forEach((Object[] entities) - {JPAAuthor author (JPAAuthor) entities[1];JPABook book (JPABook) entities[0];System.out.println(author.firstName author.lastName wrote book.title); }); 在这种情况下结果仍然是Object[] 但是这一次 Object[]并不表示具有单独列的元组而是表示由SqlResultSetMapping注释声明的实体。 这种方法很吸引人当您需要映射查询的任意结果但仍然需要托管实体时可能会使用它。 如果您想了解更多信息我们只能推荐Thorben Janssen关于这些高级JPA功能的有趣博客系列 结果集映射基础 结果集映射复杂映射 结果集映射构造函数结果映射 结果集映射休眠特定功能 结论 在ORM和SQL之间特别是在Hibernate和jOOQ之间进行选择并不总是那么容易。 当涉及到应用对象图持久性时即当您有很多复杂的CRUD涉及复杂的锁定和事务策略时ORM会大放异彩。 当运行批处理SQL用于读取和写入操作运行分析和报告时SQL表现出色。 当您“很幸运”时例如工作很简单您的应用程序仅位于安全栅的一侧您可以在ORM和SQL之间进行选择。 当您“幸运”时例如– ooooh这是一个有趣的问题您将不得不同时使用两者。 另请参阅Mike Hadlow关于该主题的有趣文章 这里的信息是可以 使用JPA的本机查询API您可以利用RDBMS的全部功能运行复杂的查询并且仍然可以将结果映射到JPA实体。 您不限于使用JPQL。 边注 尽管过去我们一直在批评JPA的某些方面有关详细信息请参阅JPA 2.1如何成为新的EJB 2.0 但我们的批评主要集中在JPA对注释的滥用上。 当使用诸如jOOQ之类的类型安全API时可以轻松地向编译器提供所有必需的类型信息以构造结果。 我们坚信将来的JPA版本将更积极地使用Java的类型系统从而可以更流畅地集成SQ​​LJPQL和实体持久性。 翻译自: https://www.javacodegeeks.com/2015/05/type-safe-queries-for-jpas-native-query-api.html
http://www.lebaoying.cn/news/9607.html

相关文章:

  • 网站建设应用程序开发网站建设策划方案模板
  • joomla做类似赶集网的网站教新手做网站难吗
  • 伊利网站建设评价一般设计网站页面用什么软件
  • 目前主流的网站开发语言兼职做商务标哪个网站
  • 有没有做京东客好的网站推荐郑州网站建设制作公司
  • 有哪些网站是中国风网站专做机酒的网站
  • 网站首页效果图合肥高端网站建设
  • 物流公司在哪做网站浏览器怎么做能不拦截网站
  • vue做网站前端建网站 必须学html吗
  • 成都建工网站有做兼职的网站吗
  • 自己做装修效果的网站你认为什么是网络营销
  • 苏州那家公司做网站比较好wordpress 怎么加速
  • 包头有没有专业做淘宝网站的网站怎么做根目录
  • 做百度企业网站有什么好处北京网站建设服务中心
  • 望城做网站找谁建筑建设网站建设
  • 彩票网站如何做wamp安装wordpress
  • 网站建设与网页制作盒子模型单页网站有哪些
  • 名师工作室网站建设建议导航类网站怎么做
  • 网站前后台代码网网站建设设计公司
  • win10做网站服务器宁波网站建设信息
  • 大唐工作室 网站制作珠海网站建设制作怎么收费
  • 广州 建 网站破解wordpress后台密码
  • 如何查看网站根目录大人怎么做羞羞的网站
  • 免费建站的网站能做影视网站吗网页制作与设计实验报告总结
  • 我国省级档案网站建设状况温州旅游 网站建设
  • 电商网站做互联网金融网站搭建要多少钱
  • 东台建设网站dede织梦织梦更换模板网站
  • 网站建设与管理用什么软件有哪些内容wordpress 文件 钩子
  • wordpress中文版广告seo技术培训海南
  • wordpress附件投稿seo教程pdf