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

一分钟做网站客户管理软件

一分钟做网站,客户管理软件,包装设计公司哪家好,传媒大学附近网站建设公司当您使用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.sadfv.cn/news/46494/

相关文章:

  • 单一产品企业或多元化产品企业的网站建设与策划有什么不同?wordpress用户权利
  • 网站建设经验会议讲话稿厦门高端模板建站
  • 广东网站开发哪家网站自响应
  • 食品网站开发毕业设计做食材的网站
  • 青岛正规品牌网站制作策划seo基础教程使用
  • 北京大良网站建设湖北住房与城乡建设部网站
  • 做3d效果图的网站哪里网站备案
  • 做网站的品牌公司有哪些美食网站建设的功能
  • 网站开发 所有权成都前几年网站建设公司
  • 招标网站排行榜企业品牌战略
  • 临沂制作手机网站提供常州网站推广
  • 网站怎么下载视频茂名营销型网站制作公司
  • wordpress搭建cms网站大学网站建设的目标与思路
  • 触屏端网站开发微信公众号登录wordpress网站吗
  • 网站的ftp地址怎么查电商网站通用左侧弹出导航
  • 搜英文关键词网站域名解析平台网站建设
  • 中小型网站建设如何wordpress 图片管理插件
  • 铜陵保障性住房和城乡建设网站人工智能培训课程
  • 网站制作div区域是哪儿网站安全的必要性
  • 个体户做盈利网站网站设计案例欣赏
  • 宣传 网站建设方案模板外贸推广方式有哪些
  • 做百度网站每年的费用多少wordpress支持HTML么
  • 腾讯云怎么备案网站新人0元购物软件
  • 网站建设运营费用包括哪些广州最新新闻事件
  • asp汽车销售公司网站源码 4s店网站源码 汽车网站建设 完整无县电子政务办网站建设工作思路
  • 宁波网站优化如何网站建设有哪些模块
  • 公司网站二维码怎么做的网页设计公司概念
  • 网站制作五个界面公司合法网站域名怎么注册
  • pc端的网站设计方案网络营销方式多样
  • 网站建设开发报价义乌广告设计与制作