好久没有去研究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
分享到:
相关推荐
总结起来,本文强调了在不同情境下,个人应如何看待和承担责任,以及如何在付出代价的同时,收获成长和回报。无论是自愿选择还是非自愿承担的责任,都应以积极的态度去面对和执行,因为这不仅关乎个人的成长,还影响...
关键在于理解,每种选择都必然伴随着代价,不存在无需付出代价的责任。 承担责任对自我成长的重要性不言而喻。它能培养我们的自尊和自信,增强我们的独立性和适应能力,是我们走向成熟的标志。因此,我们不应该因为...
这个故事启示我们,每一个成长的瞬间都可能需要我们付出代价。在这个过程中,小主人公学到了时间管理,了解到每一项活动都有其优先级,学会了为自己的选择承担责任。这个代价不仅是一次教训,更是个体成长的一次宝贵...
《不言代价与回报》是九年级政治课程中的一重要课题,主要探讨的是关于承担责任时付出的代价与获得的回报,以及如何培养学生的责任感。在本课的教学中,旨在让学生理解并认同,成为一个负责任的社会公民不仅需要理解...
1. **承担责任的代价与回报**:承担责任并不总是轻松愉快的,通常伴随着代价,如付出时间、精力、金钱,甚至可能会受到责备或处罚。同时,承担责任也有其回报,可以是物质的(如工资、奖励)或非物质的(如成就感、...
然而,承担责任的过程从来不是一帆风顺的,它往往伴随着时间和精力的付出,以及可能遭遇的困难。在某些情况下,承担特定的责任甚至可能威胁到个人的声誉和安全。 在理解了责任的双重性之后,学生们应当认识到,承担...
在承担社会责任时,我们不可避免地需要考虑将要付出的时间、精力等成本,以及通过承担该责任能够实现的自我成长和获得他人的尊重等积极回报。对此,教案以“班委改选”活动为开端,让学生们亲身体验担当班级职务的...
“代价”一词通常指的是为了达到某种目的或获得某种结果所付出的牺牲或成本,它可以是物质上的也可以是精神上的。 #### 同义词列举 - **牺牲**:指为了某种目的或价值而放弃的东西。 - **花费**:侧重于指出金钱或...
在等价关系的上下文中,代价可能指的是转换成本,即从一个元素转换到另一个元素所需付出的代价。例如,将一个集合划分为等价类时,我们需要考虑最小化这个转换过程的总代价。 以下是一个简单的C++程序框架,用于...
6. 成长与挫折:作者认为,人生的闪光点往往源于经历的磨砺和付出的代价。挫折和坎坷能让人变得更坚韧,虽然代价高昂,但能带来宝贵的经验。 7. 理想与现实:作者认识到,美好并不总是如愿以偿,人们常常在追求美好...
2. 承担责任的代价与回报:承担责任不仅需要付出时间、精力和金钱,还可能面临批评和惩罚。然而,承担责任也能带来回报,包括物质奖励和精神满足感,如提升自我价值、增强自尊自信、提高能力等。 3. 自愿选择的责任...
7. **坚强意志的塑造**:军训中的辛苦和汗水,使学生们明白成功需要付出代价,增强了他们的抗压能力和面对挫折的勇气。引用苏轼的话,“古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。”军训就是锻炼这种...
让学生这种无组织无纪律的行为付出更大的代价。 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. **个人与集体**:个人利益与集体利益相互依存,只有维护集体利益,个人利益才能得到保障。每个人都应积极参与集体建设,关心集体的荣誉和利益,通过合作解决...
它告诉我们,在现实生活中,那些看似无需付出代价的诱惑往往是最危险的。就像故事中提到的那样,钓饵上的钓钩可能会让小鱼付出生命的代价。这启示我们,在面对诱惑时,必须具备辨别真伪和警惕危险的能力。我们不能被...
总结过去一年的工作,我们获得了宝贵的经验,也为不足付出了代价。面对新的一年,我们必须采取措施,全面提升活动的后期总结质量,切实加强团员的先进性教育,保持团干部的工作热情,改进活动的秩序管理。我们相信,...
技术债务是一个经常被提及的概念,它指的是在快速开发新功能的过程中积累的问题,这些问题是需要后续付出代价来解决的。技术债务并非总是能够简单量化的,而是可能相当复杂,并且难以控制。这一现象说明,在追求短期...