好久没有去研究Hibernate了,过去的东西已经全忘。今天拾起来时我付的代价非常之大,最终根源在于没有总结以往的开发经验,异常非常之熟悉确不能快速锁定问题源。我就以下面几几个问题做为切入点来总结一下,这块里所涉及到的知识点。
问题列表:
1,分组查询
2,left outer join/right outer join/full outer join/inner outer join区别
问题1:分组查询
分组查询不就是group by嘛,确实是这样。但是在hibernate里面查出来的数据就不一样,我所有指的定是每列数据。例如:
I)HQL(Hibernate Query Language)
from SysUser user group by userId
使用HQL查询出来的是符合条件,所有字段的数据
II)QBC(Query By Criteria)
DetacheCriteria dc = DetachedCriteria.forClass(SysUser.class);
dc.setProjection(Projections.groupProperty("this.userId"));
List<SysUser> list = sysUserService.findByCriteria(dc);
这段码看上去没有一点错,我们还是用后面打印的SQL语句来说话吧。这里我就手工模拟写出后台打印SQL语句,其实意思是一样。
select this_.user_id from sys_user this_ group by this_.user_id
看完这一段SQL语句,你还认为上面代码没有错吗?相信你一眼就可以看会出现什么样的问题:ClassCastException这个异常会抛出来。问题出来那总得有解决方案吧,肯定是有的。具体怎么选择那你自己的事了。
方案一(不推荐):直接用SQL查询
方案二:是用示例查询
select new SysUser(user.userId,user.name) from SysUser user group by user.userId;
这样查底的前提是SysUser类中必须有一个SysUser(userId,name)构造方法
方案三:直接返回对象,这又是什么意思呢?看下面代码就知道意思啦
select user from SysUser user group by user.userId
查询这样的简单的表不用费多大劲。下面再看看一个复杂点的表结构。
@Entity
@Table(name = "doc_document")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class DocDocument implements java.io.Serializable {
private static final long serialVersionUID = 8811969619989885931L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "doc_document_id")
private Integer docDocumentId;
@OneToMany(mappedBy = "docDocument")
private Set<DocReceiveApprove> docReceiveApproves = new HashSet<DocReceiveApprove>(
0);
@OneToMany(mappedBy = "docDocument")
private Set<DocFbTotal> docFbTotals = new HashSet<DocFbTotal>(0);
@OneToMany(mappedBy = "docDocument")
private Set<DocSend> docSends = new HashSet<DocSend>(0);
@OneToMany(mappedBy = "docDocument")
private Set<DocAttach> docAttachs = new HashSet<DocAttach>(0);
@OneToMany(mappedBy="docDocument")
private Set<DocDocumentReturn> docDocumentReturns = new HashSet<DocDocumentReturn>(0);
//@Fetch(FetchMode.SELECT)
@OneToMany(mappedBy="docDocument")
private Set<DocDocumentUser> dcDocumentUsers = new HashSet<DocDocumentUser>(0);
........
}
@Entity
@Table(name = "doc_document_user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class DocDocumentUser implements java.io.Serializable {
private static final long serialVersionUID = 8811969619989885931L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "doc_document_user_id")
private Integer docDocumentUserId;
private Integer isflow;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "doc_document_id")
private DocDocument docDocument;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "user_id")
private CommonUser commonUser;
.........
}
@Entity
@Table(name="common_user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class CommonUser implements java.io.Serializable {
private static final long serialVersionUID = 6147253484121456257L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@JoinColumn(name = "user_id")
private Integer userId;//用户ID
//@Fetch(FetchMode.SELECT)
@OneToMany(mappedBy="commonUser")
private Set<DocDocumentUser> dcDocumentUsers = new HashSet<DocDocumentUser>(0);
@OneToMany(mappedBy="commonUser")
private Set<DocFbTotal> docFbTotals = new HashSet<DocFbTotal>(0);
@OneToMany(mappedBy="commonUser")
private Set<DocReceiveApproveCheck> docReceiveApproveChecks = new HashSet<DocReceiveApproveCheck>(0);
@OneToMany(mappedBy="commonUser")
private Set<DocReceiveinfoHst> docReceiveinfoHsts = new HashSet<DocReceiveinfoHst>(0);
@OneToMany(mappedBy="commonUser")
private Set<DocRrSend> docRrSends = new HashSet<DocRrSend>(0);
@OneToMany(mappedBy="commonUser")
private Set<DocReceiveApproveDraw> docReceiveApproveDraws = new HashSet<DocReceiveApproveDraw>(0);
@OneToMany(mappedBy="commonUser")
private Set<InfoSender> infoSenders = new HashSet<InfoSender>(0);
@OneToMany(mappedBy="commonUser")
private Set<DocPrintTrackHst> docPrintTrackHsts = new HashSet<DocPrintTrackHst>(0);
@OneToMany(mappedBy="commonUser")
private Set<LogOperation> logOperations = new HashSet<LogOperation>(0);
......
}
代码就贴一部分,可以达到理解的用途就行。
下面方法的目录还是按组查询:
public List<DocDocument> getWaitDocument() {
DetachedCriteria dc = DetachedCriteria.forClass(DocDocument.class);
dc.createCriteria("dcDocumentUsers", "ddu");
dc.setFetchMode("ddu", FetchMode.SELECT);
dc.add(Restrictions.eq("ddu.dealstatus", "1"));
dc.createCriteria("ddu.commonUser", "user");
dc.add(Restrictions.eq("user.userCode", "111"));
dc.setProjection(Projections.groupProperty("this.docDocumentId"));
List<DocDocument> list = this.documentService.findByCriteria(dc);
}
好啦,问题源肯定不用说就可以看出来啦。
如果我想得到DocDocument对象的某个Set集合对象,我想方案一/方案二全部用不上了。但是方案三就得改造一下,如下:
String hql = "select doc from DocDocument as doc left join doc.dcDocumentUsers as ddu left join ddu.commonUser as user group by doc.docDocumentId order by doc.docDocumentId desc";
好啦问题总算解决啦。
总结一下,我们的解决方案用的就是下一个问题所要提到的东西。那咱们就进入第二个问题讲解。
首先我们得了解一下,left outer join/right outer join/full outer join/inner outer join的工作原理。
引用
假设a表和b表的数据是这样的。
a b
id name id stock
1 a 1 15
2 b 2 50
3 c
select * from a inner join b on a.id=b.id
这个语法是连接查询中的内连接,它产生的结果是
两个表相匹配的记录出现在结果列表中。
根据上面的表,出现的结果是这样的
a.id name b.id stock
1 a 1 15
2 b 2 50
----------------------------
select * from a,b where a.id=b.id
这个语法是内连接的另外一种写法,其执行结果与inner join 一样
--------------------------------
select * from a left/right join b on a.id=b.id
这个是外连接语法中的左外连接或右外连接
如果是左外连接的话,它将显示a表的所有记录,
select a.*,b.* from a left join b on a.id=b.id
查询的结果是这样的:
a.id name b.id stock
1 a 1 15
2 b 2 50
3 c null null
--------------------------------------------
如果是右外连接的话,它将显示b表的所有记录,
select a.*,b.* from a right join b on a.id=b.id
查询的结果是这样的:
a.id name b.id stock
1 a 1 15
2 b 2 50
知道原理了就知道为什么在每一个问题上面要修改一下方案三(因为查询语句返回的是三个对象的数据,也就是说三张表的数据,所以通过select doc可以得到结果)。
讲到这里截取两张Hibernate注解API文档的图片来讲解一下抓取策略。
今天就总结这两个问题
- 大小: 52.2 KB
- 大小: 87 KB
分享到:
相关推荐
在人生的不同阶段,我们都会面临各种代价的选择,就像作文中的故事所描绘的那样。 首先,代价并不总是负面的。在第一个故事中,小主人公为了阅读而与母亲周旋,虽然最后付出了被责罚的代价,但这也让她明白了时间...
总结起来,本文强调了在不同情境下,个人应如何看待和承担责任,以及如何在付出代价的同时,收获成长和回报。无论是自愿选择还是非自愿承担的责任,都应以积极的态度去面对和执行,因为这不仅关乎个人的成长,还影响...
在面对责任时,不应因为害怕付出代价而回避,因为承担责任是个人成熟的重要标志。 2. 活动一:“班委改选”旨在让学生扮演不同角色,体验承担责任的感受。通过角色扮演和讨论,学生们认识到承担责任既有益于他人,...
总结,承担责任是我们成长的重要部分,无论选择的或是非选择的责任,都需要我们以积极的态度去面对,付出必要的代价,同时也享受它带来的成长和回报。青少年时期尤其需要学会承担和选择,这将为未来的人生奠定坚实的...
《不言代价与回报》是九年级政治课程中的一重要课题,主要探讨的是关于承担责任时付出的代价与获得的回报,以及如何培养学生的责任感。在本课的教学中,旨在让学生理解并认同,成为一个负责任的社会公民不仅需要理解...
1. **承担责任的代价与回报**:承担责任并不总是轻松愉快的,通常伴随着代价,如付出时间、精力、金钱,甚至可能会受到责备或处罚。同时,承担责任也有其回报,可以是物质的(如工资、奖励)或非物质的(如成就感、...
代价可能包括时间、精力的付出,甚至可能面临失败后的责备。而回报则可能是个人的自尊和自信的增强,能力的提升,以及社会的认可。通过案例分析和体验式学习,学生将认识到承担责任不仅是个人成长的必经之路,也是...
“代价”一词通常指的是为了达到某种目的或获得某种结果所付出的牺牲或成本,它可以是物质上的也可以是精神上的。 #### 同义词列举 - **牺牲**:指为了某种目的或价值而放弃的东西。 - **花费**:侧重于指出金钱或...
在等价关系的上下文中,代价可能指的是转换成本,即从一个元素转换到另一个元素所需付出的代价。例如,将一个集合划分为等价类时,我们需要考虑最小化这个转换过程的总代价。 以下是一个简单的C++程序框架,用于...
6. 成长与挫折:作者认为,人生的闪光点往往源于经历的磨砺和付出的代价。挫折和坎坷能让人变得更坚韧,虽然代价高昂,但能带来宝贵的经验。 7. 理想与现实:作者认识到,美好并不总是如愿以偿,人们常常在追求美好...
抱有侥幸心理,不遵守安全规定,可能会付出沉重代价。我们需要对安全生产监管的要求积极响应,对每一个环节都严谨对待,彻底消除隐患,防止事故发生。 最后,安全更是一种责任。我们每个人都有责任确保自身和他人的...
2. 承担责任的代价与回报:承担责任不仅需要付出时间、精力和金钱,还可能面临批评和惩罚。然而,承担责任也能带来回报,包括物质奖励和精神满足感,如提升自我价值、增强自尊自信、提高能力等。 3. 自愿选择的责任...
7. **坚强意志的塑造**:军训中的辛苦和汗水,使学生们明白成功需要付出代价,增强了他们的抗压能力和面对挫折的勇气。引用苏轼的话,“古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。”军训就是锻炼这种...
7. 成功的代价:通过成龙的故事,作者强调成功背后的努力和付出,提醒读者不应只看到表面的光鲜。 8. 经验积累:实习不仅是理论知识的实践,更是个人成长和经验积累的过程,有助于更好地融入社会。 总结起来,这篇...
让学生这种无组织无纪律的行为付出更大的代价。 schools can impose fines on students who are late, absent, or truant, and cancel their qualifications for future internships. 本文总结了职校生个人实习的...
- 教学重点之一是让学生明白,承担任何责任都需要付出代价,可能包括时间、精力、金钱甚至个人的舒适度。例如,担任学生干部可能会牺牲部分娱乐时间,但这种付出有助于提升领导力和团队协作能力。 - 通过李岚的...
通过白方礼和杨小婷的事迹,课程展现了不计代价、无私奉献的精神,这些榜样人物的行为让社会变得更加美好。 课堂练习和小结部分,进一步巩固了学生对承担责任的理解,强调我们应该感激并尊重那些不求回报、勇于承担...
TCP 在网络通信上有极强的生命力,但可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此 TCP 传输的效率不如 UDP 高。UDP 操作简单,而且仅需要较少的监护,因此通常用于...
他们不仅勇敢地面对逆境,而且愿意为实现目标付出代价。这种勇气和责任感是成为男子汉的重要品质。 2. 追逐梦想与现实的平衡:作者分享了自己高中时期的故事,揭示了追求梦想并不意味着要忽视现实。他通过写作赚取...
他们的付出使社会变得更加和谐、安全和充满希望。 5. **个人与集体**:个人利益与集体利益相互依存,只有维护集体利益,个人利益才能得到保障。每个人都应积极参与集体建设,关心集体的荣誉和利益,通过合作解决...