hibernate 排序_Hibernate提示:排序和排序

hibernate 排序

让我们介绍另一个Hibernate性能提示。 你还记得以前的Hibernate的模式后 ? 我们有一个与一对多协会有关的星际飞船和军官。

@Entity
public class Starship {@Id @GeneratedValue(strategy=GenerationType.SEQUENCE) private Long id;public Long getId() {return id;}protected void setId(Long id) {this.id = id;}@OneToMany(mappedBy="starship", cascade={CascadeType.ALL}) private List<Officer> officers = new ArrayList<Officer>();public List<Officer> getOfficers() {return Collections.unmodifiableList(officers);}protected void setOfficers(List<Officer> officers) {this.officers = officers;}public void addOfficer(Officer officer) {officer.setStarship(this);this.officers.add(officer);}//more code
}@Entity
public class Officer {@Id @GeneratedValue(strategy=GenerationType.SEQUENCE) private Long id;public Long getId() {return id;}protected void setId(Long id) {this.id = id;}@ManyToOne private Starship starship; public Starship getStarship() {return starship;}protected void setStarship(Starship starship) {this.starship = starship;}//more code
}

现在我们有下一个要求:
我们将按字母顺序将所有军官分配给星际飞船。
为了解决这一要求,我们可以:

  1. 使用order by子句实现HQL查询。
  2. 使用排序方法。
  3. 使用订单方法。

第一个解决方案在性能方面不错,但是暗示了作为开发人员的工作量更多,因为我们应该编写一个查询来查找按名称排序的给定飞船的所有人员,然后在DAO层中创建finder方法(如果您使用的是DAO模式 ) 。
让我们探索第二个解决方案,我们可以使用SortedSet类作为关联,并使Officer实现Comparable ,因此Officer具有 自然秩序。 该解决方案的工作量少于第一个,但需要在关联定义上使用@Sort Hibernate注释,因此让我们修改以前的模型以满足我们的新要求。请注意, JPA规范中没有等效的注释。
首先我们要实施

@Entity
public class Officer implements Comparable<Officer>{//getters, setters, equals, ... codepublic int compareTo(Officer officer) {return this.name.compareTo(officer.getName());}}

官员类中的可比接口。

我们通过简单地比较名称字段来按名称订购人员。 下一步是使用@Sort注释关联。

@Entity
public class Starship {//more code@OneToMany(mappedBy="starship", cascade={CascadeType.ALL})@Sort(type=SortType.NATURAL)private SortedSet>Officer< officers = new TreeSet>Officer<();public SortedSet>Officer< getOfficers() {return Collections.unmodifiableSortedSet(officers);}protected void setOfficers(SortedSet>Officer< officers) {this.officers = officers;}public void addOfficer(Officer officer) {officer.setStarship(this);this.officers.add(officer);}
}

注意,现在人员关联是使用SortedSet而不是List来实现的。 此外,我们在关系中添加了@Sort批注,表明官员应自然而有序。 在完成本文之前,我们将在@Sort主题中坚持使用更多内容,但到目前为止已经足够。

最后是一种方法,该方法可以按名称将给定飞船的所有军官排序,并将其打印在日志文件中。

EntityManager entityManager = this.entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();transaction.begin();
log.info("Before Find Starship By Id");Starship newStarship = entityManager.find(Starship.class, starshipId);
SortedSet<Officer> officers = newStarship.getOfficers();for (Officer officer : officers) {log.info("Officer name {} with rank {}", officer.getName(), officer.getRank());
}log.info("After Find Starship By Id and Before Commit");transaction.commit();
entityManager.close();

所有人员均按其姓名排序,但让我们检查将哪些查询发送到RDBMS

Hibernate: select starship0_.id as id1_0_, starship0_.affiliationEnum as affiliat2_1_0_, starship0_.launched as launched1_0_, starship0_.height as height1_0_, starship0_.length as length1_0_, starship0_.power as power1_0_, starship0_.width as width1_0_, starship0_.registry as registry1_0_, starship0_.starshipClassEnum as starship9_1_0_ 
from Starship starship0_ where starship0_.id=?Hibernate: select officers0_.starship_id as starship7_1_1_, officers0_.id as id1_, officers0_.id as id0_0_, officers0_.affiliationEnum as affiliat2_0_0_, officers0_.homePlanet as homePlanet0_0_, officers0_.name as name0_0_, officers0_.rank as rank0_0_, officers0_.speciesEnum as speciesE6_0_0_, officers0_.starship_id as starship7_0_0_ 
from Officer officers0_ where officers0_.starship_id=?

第一个查询是在EntityManager实例查找星舰上调用find方法导致的。

因为默认情况下,当我们调用getOfficers方法并且第一次访问SortedSet时 ,一对多关系是惰性的,所以执行第二个查询来检索所有人员。 可以看到查询中不存在order by子句,但仔细查看输出,就会按字母顺序检索人员。

<Officer name Beverly Crusher with rank COMMANDER>
<Officer name Data with rank LIEUTENANT_COMMANDER>
<Officer name Deanna Troi with rank COMMANDER>
<Officer name Geordi La Forge with rank LIEUTENANT>
<Officer name Jean-Luc Picard with rank CAPTAIN>
<Officer name William Riker with rank COMMANDER>
<Officer name Worf with rank LIEUTENANT>

那么谁是整理人员实体? 说明在@Sort注释上。 在Hibernate状态下,一个排序的集合在Java内存中排序,它负责使用compareTo方法对数据进行排序。
显然,此方法不是对元素集合进行排序的最佳性能方法。 在使用SQL子句和使用注释而不是编写查询之间,我们可能需要一个混合解决方案。

这使我们使用排序方法来解释第三种可能性。 @OrderBy注释(可作为Hibernate注释和JPA注释使用)让我们指定如何通过在生成的SQL中添加“ order by ”子句来对集合进行排序

请记住,使用javax.persistence.OrderBy允许我们通过对象属性指定集合的​​顺序,同时org.hibernate.annotations.OrderBy对集合进行排序,将SQL的片段(不是HQL )直接附加到order by子句中。
现在不应该触动Officer类,我们不需要实现compareTo方法或java.util.Comparator 。 我们只需要使用@OrderBy注释来注释人员字段。 由于在这种情况下,我们通过简单的属性进行排序,因此使用JPA注释来保持与其他“支持JPA的ORM引擎的完全兼容性。 默认情况下,假定升序。

@Entity
public class Starship {//code@OneToMany(mappedBy="starship", cascade={CascadeType.ALL})@OrderBy("name")private List<Officer> officers = new ArrayList<Officer>();public List<Officer> getOfficers() {return Collections.unmodifiableList(officers);}protected void setOfficers(List<Officer> officers) {this.officers = officers;}public void addOfficer(Officer officer) {officer.setStarship(this);this.officers.add(officer);}
}

如果我们重新运行所有人员的方法,则会发送下一个查询:

Hibernate: select starship0_.id as id1_0_, starship0_.affiliationEnum as affiliat2_1_0_, starship0_.launched as launched1_0_, starship0_.height as height1_0_, starship0_.length as length1_0_, starship0_.power as power1_0_, starship0_.width as width1_0_, starship0_.registry as registry1_0_, starship0_.starshipClassEnum as starship9_1_0_ 
from Starship starship0_ where starship0_.id=?Hibernate: select officers0_.starship_id as starship7_1_1_, officers0_.id as id1_, officers0_.id as id0_0_, officers0_.affiliationEnum as affiliat2_0_0_, officers0_.homePlanet as homePlanet0_0_, officers0_.name as name0_0_, officers0_.rank as rank0_0_, officers0_.speciesEnum as speciesE6_0_0_, officers0_.starship_id as starship7_0_0_ 
from Officer officers0_ where officers0_.starship_id=? order by officers0_.name asc

这两个查询仍然执行,但是请注意,现在select查询也包含order by子句。

使用此解决方案,您可以节省处理时间,从而允许RDBMS快速对数据进行排序,而不是在收到Java数据后对其进行排序。
此外, OrderBy批注不会强制您使用SortedSetSortedMap集合。 您可以使用HashMapHashSet甚至Bag之类的任何集合,因为Hibernate将在内部分别使用LinkedHashMapLinkedHashSetArrayList

在这个例子中,我们已经看到了正确选择订购策略的重要性。 只要有可能,您都应该尝试利用RDBMS的功能,因此您的第一个选择应该是使用OrderBy注释( HibernateJPA ),而不是Sort 。 但是有时OrderBy子句是不够的。 在这种情况下,建议您使用具有自定义类型的Sort批注(使用java.util.Comparator类),而不是按自然顺序进行中继以避免触摸模型类。

@Sort(type=SortType.COMPARATOR, comparator=TimeComparator.class)

我希望这篇文章能帮助您了解Hibernate状态下 “排序”“顺序”之间的区别。

保持学习。

参考: Hibernate提示:我们的JCG合作伙伴 Alex Soto在“ 一个罐子统治所有”博客上进行了排序和订购 。


翻译自: https://www.javacodegeeks.com/2012/04/hibernate-tip-sort-and-order.html

hibernate 排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苏宁大数据怎么运营_苏宁云商“三驾马车”:大数据、大物流、大金融并行

(赢商网1月15日报道)随着“未来的零售企业是线上线下的完美融合”这一趋势的走红&#xff0c;2013年年初苏宁电器决定更名为“苏宁云商”&#xff0c;而在更名之后&#xff0c;公司的转型步伐一直在不断加快&#xff0c;行动力也令业界为之刮目相看。“大物流”模式今日&#x…

VueJS组件之全局组件与局部组件

全局组件 所有实例都能用全局组件。 HTML <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> <script src"https://cdn.bootcss.com/vue/2.2.2/vue.min.js&quo…

Spark简介,您的下一个REST Java框架

希望今年您对Java的热情很高&#xff01; 今天&#xff0c;我们将研究一个清新&#xff0c;简单&#xff0c;美观且实用的框架&#xff0c;以Java编写REST应用程序。 它将非常简单&#xff0c;甚至根本不会看起来像Java。 我们将研究Spark Web框架。 不&#xff0c;它与Apache…

jq的插件 vue中引用_详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件

本篇文章主要介绍了详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件&#xff0c;具有一定的参考价值&#xff0c;有兴趣的可以了解一下使用vue-cli构建的vue项目&#xff0c;webpack的配置文件是分散在很多地方的&#xff0c;而我们需要修改的是build/webpack.base…

SQL Search

Press TAB to expand wildcard tab键之后&#xff0c;会自动展开&#xff0c;直接枚举表中所有的字段 根据名字查找存储过程&#xff0c;发现找不到 原因是&#xff0c;本地是一个备份库。服务器上通过sql source control进行版本控制的。 在通过sql source control将服务器上新…

Java日期工具类

Java日期工具类对日期格式进行转化&#xff0c;例如&#xff0c;将2018-12-13转化成20181213&#xff0c;也可以反过来。 package main.java.utils;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class DateUtil {/*** …

两个数组合成一个json对象_两个jsonarray合并

技术文档主体内容&#xff1a;可以认为是页面最想表达的内容总和。对于内容详情页来说&#xff0c;主体内容指从标题开始至正文内容结束&#xff0c;翻页区域也被视为主体内容&#xff0c;文章后的评论、分享、推荐等不视为主体内容。首屏&#xff1a;用户点击搜索结果后进入移…

04_传智播客iOS视频教程_类是以Class对象存储在代码段

1231312转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/7097077.html

drools的guvnor_Drools Guvnor –管理访问

drools的guvnor外部化业务或技术规则对于可伸缩应用程序非常重要&#xff0c;但是应该管理BRMS服务访问。 guvnor使用基于角色的授权提供控件UI访问和操作。 在drools-guvnor参考手册中列出了几种权限类型。 具有所有权限的管理员。 分析师或只读分析师&#xff1a;特定类别的分…

安卓实现序列化之Parcelable接口

安卓实现序列化之Parcelable接口 1.实现序列化的方法&#xff1a; Android中实现序列化有两个选择&#xff1a;一是实现Serializable接口&#xff08;是JavaSE本身就支持的&#xff09; 。一是实现Parcelable接口&#xff08;是Android特有功能&#xff0c;效率比实现Serializa…

容器对象模式。 一种新的测试模式。

如果您搜索什么是页面对象的描述&#xff0c;就会发现页面对象模式为我们提供了一种以可重用和可维护的方式对内容建模的常识方法。 还要指出&#xff1a;在Web应用程序的UI中&#xff0c;您的测试与某些区域交互。 Page Object只是将它们建模为测试代码中的对象。 这减少了重…

字符串工具类,随机生成字符串

字符串工具类&#xff0c;随机生成字符串package main.java.utils;import java.util.Map; import java.util.Random;public class StrUtil {/*** 定义一个字符串&#xff08;A-Z&#xff0c;a-z&#xff09;*/private static final String STR_ONE "abcdefghijklmnopqrs…

css与网页制作

百度&#xff1a;常用DIVCSS命名大全集合转载于:https://www.cnblogs.com/Tpf386/p/7100017.html

Oracle修改密码文件_转载:Oracle修改用户密码

转载一位大佬的博文&#xff0c;用于帮助常忘记密码的我和某些同道。1. 通过系统管理员(system)修改密码修改普通用户密码相对来说简单很多。1.1 登录系统管理员账户。一般为system。1.2 查询当前系统存在的用户。这一步属于辅助性查找&#xff0c;可以不执行。select username…

爬虫突破IP封锁

爬虫突破IP封锁 爬取网站最常出现的问题就是IP封锁的问题,较为简单的方法就是购买有效IP,免费IP虽然不花钱,但是不好用,做爬取测试的时候还勉强能用。 我从快代理购买付费的IP,把自己的电脑的IP加入白名单,再使用其提供的Api获取有效IP进行爬取。 package com.zhq.crawle…

Python异常处理和进程线程

写在前面 最坏的结果&#xff0c;不过是大器晚成&#xff1b; 一、异常处理 - 1.语法错误导致的异常 - 这种错误&#xff0c;根本过不了python解释器的语法检测&#xff0c;必须在程序运行前就修正&#xff1b; - 2.逻辑上的异常 - 即逻辑错误&#xff0c;例如除零错误&#xf…

在Oracle中使用JDBC插入功能

介绍 在本文中&#xff0c;我将显示一个示例&#xff0c;说明如何使用Oracle支持的JDBC批量插入功能&#xff0c;这些功能特定于Oracle。 有关为什么可能希望一般使用批量插入的更多详细信息&#xff0c;例如&#xff0c;在某些情况下需要考虑性能&#xff0c;请参阅Joormana …

css语法和规则

语法&#xff1a; Selector{sRule!important;} 说明&#xff1a; 提升指定样式规则的应用优先权。 IE6及以下浏览器有个比较显式的支持问题存在&#xff0c;!important并不覆盖掉在同一条样式的后面的规则。请看下述代码&#xff1a; 示例代码&#xff1a; div{color:#f00!impo…

vue 代理重定向_关于vue-router,路由重定向的使用分析

看之前的项目&#xff0c;突然发现一个不算bug的bug&#xff0c;之前也是一直没有想到&#xff0c;现在发现之后越来越觉得有必要改掉&#xff0c;项目用的是vue做的&#xff0c;自然切换用的就是路由&#xff0c;一级路由包括&#xff1a;首页、记录和个人中心&#xff0c;二级…

WebMagic爬取58同城租房数据

WebMagic爬取58同城租房数据 1.WebMagic webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。 webmagic的主要特色: 完全模块化的设计,强大…