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

十大SEO网站外链建设误区邢台太行中学地址

十大SEO网站外链建设误区,邢台太行中学地址,怎样做php网站,黑龙江 俄语网站制作JPA有自己的查询语言#xff0c;称为JPQL。 JPQL与SQL非常相似#xff0c;主要区别在于JPQL与应用程序中定义的实体一起使用#xff0c;而SQL与数据库中定义的表和列名称一起使用。 在定义将对定义的Entity类执行CRUD操作的JPA查询时#xff0c;JPA为我们提供了多种选择。 … JPA有自己的查询语言称为JPQL。 JPQL与SQL非常相似主要区别在于JPQL与应用程序中定义的实体一起使用而SQL与数据库中定义的表和列名称一起使用。 在定义将对定义的Entity类执行CRUD操作的JPA查询时JPA为我们提供了多种选择。 这些选项是动态查询命名查询和条件查询。 这篇文章试图详细介绍每个选项重点放在何时使用每种类型的查询定义可能的性能问题以及与动态查询相关的一些安全威胁。 动态查询 应用程序在运行时创建的查询称为动态查询。 当我们将简单的JPA兼容查询字符串传递给EntityManager类的createQuery方法时就会创建动态查询。 定义动态查询有其优点和缺点。 让我们依次查看它们中的每一个。 优点 使用动态查询的主要优点是在运行时之前以及查询的结构取决于用户输入或其他条件之前您都不知道查询的外观。 缺点 动态查询的主要缺点是每次调用时将JPQL查询转换为SQL都会产生成本。 大多数提供程序可能会尝试缓存从动态查询生成的SQL查询但是这样做可能并不总是成功的。 当不使用查询将参数值直接绑定到查询字符串中时查询将不会被缓存或提供程序会发现难以缓存的情况。 在该示例中由于每次调用JPQL都会由于动态参数而生成新查询因此不会缓存查询。 Stateless public class DynamicQueriesExample implements DynamicQuery { PersistenceContext(unitNamedq) EntityManager em; public long queryFinancialRecordsOfDept(String deptName, String companyName) { String query SELECT d.records FROM Department d WHERE d.name deptName AND d.company.name companyName ; return em.createQuery(query, Long.class).getSingleResult(); } } 在上面的查询中我们在查询字符串中包含了deptName和companyName值。 结果每次调用queryFinancialRecordsOfDept方法时都会生成一个新查询。 这个新查询很难缓存因为变量几乎每次都使String唯一。 因此如果您的应用程序中有很多动态查询并且经常调用它们那么您将需要解决性能问题。 上面编写的动态查询的第二个问题是实际的串联操作。 由于您使用的是简单的String串联并且String是不可变的因此JVM将生成许多String对象其中大多数将最终被丢弃并一直存在于您的内存中直到发生下一个垃圾回收为止。 这又可能会影响您的应用程序的性能。 如上所述动态查询的第三个问题是安全性。 例如在上面的查询中黑客可以轻松地输入companyName的值来更改查询以发挥自己的优势。 在应用程序中查找期望的查询比我们想象的要容易。 从应用程序进行的简单堆栈跟踪揭示了许多无法想象的东西。 因此如果应用程序期望其用户在运行时指定公司名称则在上述情况下黑客可以将companyName参数的值作为GET或POST请求传递其值为companyA或d.company.name companyB SELECT d.records FROM Department d WHERE d.name deptA AND d.company.name companyAOR d.company.name companyB; 通过使用JPA的命名/位置参数功能可以轻松地减少这种类型的安全风险。 命名参数可帮助我们在查询处理的后续阶段将值绑定到查询。 通过使用命名参数查询不会每次都针对不同的参数而更改。 因此查询保持不变并且提供程序可以轻松地对其进行缓存。 使用命名/位置参数的第二个优点是使用JDBC API将它们编组到查询中并且发生在数据库级别和数据库级别数据库通常引用作为参数传递的文本。 因此在上述情况下我们可以更改查询以使用命名/位置参数 方式1命名参数 public long queryFinancialRecordsOfDept(String deptName, String companyName) { String query SELECT d.records FROM Department d WHERE d.name :deptName AND d.company.name :compName;return em.createQuery(query,Long.class).setParameter(deptName , deptName).setParameter(compName , companyName).getSingleResult(); } } 方式2位置参数 public Long queryFinancialRecordsOfDept(String deptName, String companyName) { String query SELECT d.records FROM Department d WHERE d.name ?1 AND d.company.name ?2; return em.createQuery(query,Long.class).setParameter(1 , deptName).setParameter(2 , companyName).getSingleResult(); } } 指定参数的方式1使用命名变量可以使用查询对象上的setParameter方法为其提供值。 指定参数的方式2使用数字或索引将查询参数绑定到查询字符串。 注意我们可以在查询中多次使用相同的命名参数但只需要使用setParameter函数将值绑定一次即可。 命名查询 命名查询是一种以更具可读性可维护性和高性能的方式组织静态查询的方法。 JPA中的命名查询是使用NamedQuery批注定义的。 此注释只能在类级别上应用查询将在其上进行操作的实体是定义命名查询的好地方。 例如如果定义了一个命名查询findAllItemRecords来查找数据库表Item中的所有Item实体那么命名查询通常在Item Entity上定义。 这是一个例子 NamedQuery(nameItem.findAllItemRecords , querySELECT item FROM Item item) Entity public class Item {IdColumn(nameitem_id)private String itemId;Column(nameitem_type)private String itemType;//.......} 上面要注意的一件事是我们在字符串上使用了串联操作。 但这不会像动态查询那样出现性能问题因为持久性提供程序将在部署时将命名查询从JPQL转换为SQL并将其缓存以备后用。 这意味着仅在部署时才感觉到使用串联的开销而不是在应用程序每次使用查询时才感觉到。 像上面那样串联查询的好处是它使查询更具可读性因此更易于维护。 命名查询要记住的一件事是查询的名称范围是整个持久性单元因此不可能有两个具有相同名称的命名查询。 您应该对每个命名查询使用限定符。 通常使用实体名称如我们在上面的示例中所做的那样因为前缀是一个不错的选择。 我们可以使用NamedQueries批注为给定实体定义多个NamedQueries。 让我们看一下指定多个命名查询的示例。 NamedQueries({ NamedQuery(nameItem.findAllItemRecords , querySELECT item FROM Item item WHERE item.itemId:itemId), NamedQuery(nameItem.findItemByType , querySELECT item FROM Item item WHERE item.itemType:itemType) }) Entity public class Item {IdColumn(nameitem_id)private String itemId;Column(nameitem_type)private String itemType;//.......} 我们可以在EntityManager上使用createNamedQuery方法在方法中使用命名查询。 public Item findAllItemRecords(String itemId) { return em.createNamedQuery(Item.findAllItemRecords, Item.class) .setParameter(itemId, itemId) .getSingleResult();摘要 我们在这篇小博文中讨论了JPA中动态查询和命名查询之间的区别。 在下一篇博客文章中我们将介绍Criteria API及其使用方式。 这篇博客文章的内容是阅读优秀书籍Pro JPA 2的结果 。 我会推荐给从事JPA相关项目的任何人。 参考 JPA 2 | 动态查询与 JavaWorld博客博客中的JCG合作伙伴 Anuj Kumar 命名的查询 。 翻译自: https://www.javacodegeeks.com/2013/06/jpa-2-dynamic-queries-vs-named-queries.html
http://www.pierceye.com/news/380943/

相关文章:

  • 中铁十六局工资明细沧州网站seo公司
  • 北京网站建设软件网页制作自我介绍源代码
  • 怎么注册公司的网站免费可以做旅游海报 的网站
  • 贵阳网站建设包首页微商建立网站
  • ppt制作软件全模板免费大连seo网站管理
  • 网站门户设计设计师的网站有哪些
  • 旅游公司网站建设百度一下官方下载安装
  • 网站上传大马后怎么做宁波seo推广公司电话
  • 长沙建网站培训机构织梦网站采集侠怎么做
  • 行政事业单位网站建设动漫设计与制作大学
  • 网站链接推广工具建立网站平台
  • 做网站需要学什么软件做网站智能工具
  • 成品网站代理上海的建设项目招投标在哪个网站
  • 阿里云的网站建设花钱么广州市建设职业培训学校网站
  • 网站建设和前端开发的区别哈尔滨网站制作方案
  • 改进网站的建议网易邮箱网页版
  • 南宁市做网站的公司新浪云能用wordpress
  • 网站建设品牌有哪些重庆seo排名收费
  • 发优惠券网站怎么做大连开发区做网站
  • 烟台免费网站建设宝应网站开发
  • 用网站做淘宝客的人多吗3liang 设计网站 源码
  • 实训小结网站建设国内外最新新闻
  • 最新网站排名优化方法云龙徐州网站开发
  • 扬州做网站多少钱免费拿货的代理商
  • html做校园网站服装设计图片
  • 做三网站推广一般给多少钱
  • 网站关键词的写法牛肉煲的做法
  • 网站权限怎么设置吉林电商网站建设报价
  • wordpress修改站点名wordpress 插件 调用
  • vs2015做的网站广东省白云区属于哪个市