﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java-随笔分类-Hibernate/JPA</title><link>http://www.blogjava.net/zhaozhenlin1224/category/43792.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 13 Apr 2011 04:13:05 GMT</lastBuildDate><pubDate>Wed, 13 Apr 2011 04:13:05 GMT</pubDate><ttl>60</ttl><item><title>类之间的关联查询</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/04/12/348128.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Tue, 12 Apr 2011 03:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/04/12/348128.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/348128.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/04/12/348128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/348128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/348128.html</trackback:ping><description><![CDATA[如果要通过Student的Team的teamName查询一个Student记录，很多人都会这么写： <br />
<div class="dp-highlighter"><br />
<ol class="dp-j">
    <li><span><span>DetachedCriteria dc = DetachedCriteria.forClass(Student.</span><span class="keyword"><strong><font color="#7f0055">class</font></strong></span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>dc.add(Restrictions.like(</span><span class="string"><font color="#0000ff">"team.teamName"</font></span><span>, teamName, MatchMode.ANYWHERE));&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none;" name="code">DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE));</pre>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;  <br />
遗憾的是上述程序报错，说是在Student中找不到team.teamName属性，这是可以理解的。那么如何通过teamName查找Student呢？ <br />
可以这么写： <br />
<div class="dp-highlighter"><span><span>DetachedCriteria dc = DetachedCriteria.forClass(Student.</span><span class="keyword"><strong><font color="#7f0055">class</font></strong></span><span>); </span></span>
<ol class="dp-j">
    <li><span>dc.createAlias(</span><span class="string"><font color="#0000ff">"team"</font></span><span>, </span><span class="string"><font color="#0000ff">"t"</font></span><span>); &nbsp;&nbsp;</span></li>
    <li><span>dc.add(Restrictions.like(</span><span class="string"><font color="#0000ff">"t.teamName"</font></span><span>, teamName, MatchMode.ANYWHERE));&nbsp; <br />
    </span></li>
</ol>
<span></span> </div>
<pre class="java" style="display: none;" name="code">DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
dc.createAlias("team", "t");
dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE));</pre>
<br />
没错，就是要先建立team的引用，才能用team导航到teamName。 <br />
<br />
这里有一个特殊情况，如果是对引用对象的id查询，则可以不用建立引用，也就是可以不调用createAlias()语句，如下所示： <br />
<div class="dp-highlighter">
<ol class="dp-j">
    <li><span><span>DetachedCriteria dc = DetachedCriteria.forClass(Student.</span><span class="keyword"><strong><font color="#7f0055">class</font></strong></span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>dc.add(Restrictions.like(</span><span class="string"><font color="#0000ff">"team.id"</font></span><span>, teamId, MatchMode.ANYWHERE));&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none;" name="code">DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));</pre>
<br />
据我个人的经验，team后只能跟其主键属性，比较其他属性要用别名。此主键属性可以用&#8220;id&#8221;字符来指代，也可以用team的主键属性来指代.如果仅用主键来关联，可以不用detachedCriteria，用criteria就可以了<br />
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/348128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-04-12 11:58 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/04/12/348128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>a different object with the same identifier value was already associated with the session:</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/25/345144.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Fri, 25 Feb 2011 12:41:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/25/345144.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/345144.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/25/345144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/345144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/345144.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<p>org.hibernate.NonUniqueObjectException:
a different object with the same identifier value was already
associated with the session:</p>
<p>session中存在两个相同的对象</p>
<p>是在删除一个对象的时候出现的这个问题的</p>
<p>(出现问题的方法)</p>
<p>public boolean delectPostByPK(int pk) {&nbsp;&nbsp;<br />
&nbsp;&nbsp; boolean r = false;<br />
&nbsp;&nbsp; Post p = new Post();&nbsp;&nbsp;<br />
&nbsp;&nbsp; p.setId(pk);<br />
&nbsp;&nbsp; baseManager.delete(p);<br />
&nbsp;&nbsp; r = true;<br />
&nbsp;&nbsp; return r;<br />
}//因为是重新新建了一个对象，而session那边也有一个id为pk的对象，所以删除的时候我新建的对象与session里面的对象相同，导致出现两个相同的对象</p>
<p>(修改好后的方法)</p>
<p> public boolean delectPostByPK(int pk) { <br />
&nbsp;&nbsp; boolean r = false;<br />
&nbsp;&nbsp; Post p = (Post) baseManager.getObject(Post.class, pk);&nbsp;&nbsp;<br />
&nbsp;&nbsp; baseManager.delete(p);<br />
&nbsp;&nbsp; r = true;<br />
&nbsp;&nbsp; return r;<br />
}//Post是直接在数据库中读取的，所有它与session中的对象是同一个对象</p>
<p>我纳闷的时候，从页面上查看一个post，然后在页面上点击删除按钮，就没有问题。这个跟报错误的代码流程是一样的啊。到底怎么回事<br />
</p>
</div>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/345144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-02-25 20:41 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/02/25/345144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate笔记</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/11/29/339324.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 29 Nov 2010 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/11/29/339324.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/339324.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/11/29/339324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/339324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/339324.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: getCurrentSession():表示当前环境没有Session时，则创建一个，否则不用创建&nbsp; openSession()：&nbsp;&nbsp;&nbsp;&nbsp; 表示创建一个Session(3.0以后不常用)，使用后需要关闭这个Session&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两方法的区别：&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhaozhenlin1224/archive/2010/11/29/339324.html'>阅读全文</a><img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/339324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-11-29 16:01 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/11/29/339324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 查询条件的日期处理</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/03/26/316664.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Fri, 26 Mar 2010 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/03/26/316664.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/316664.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/03/26/316664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/316664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/316664.html</trackback:ping><description><![CDATA[<p>利用Criteria查询的时候，关于日期的处理代码如下：<br />
<font style="background-color: #c0c0c0"><font style="background-color: #c0c0c0">SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );<br />
&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctr.add( Restrictions.ge("timestamp", sdf.parse(startDate.concat(" 00:00:00"))) );<br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;catch( ParseException ignore ) {}</font><br />
<br />
<br />
<font style="background-color: #c0c0c0">try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctr.add( Restrictions.le("timestamp", sdf.parse(endDate.concat(" 23:59:59"))) );<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;catch( ParseException ignore ) {}<br />
<br />
如果用hibernate sql，日期参数就不能这么写，不然查询结果会有问题。<br />
<font style="background-color: #c0c0c0">&nbsp;String start = startDate.concat(" 00:00:00");<br />
&nbsp;&nbsp; String end = endDate.concat(" 23:59:59");<br />
&nbsp;&nbsp;List ret = new ArrayList();<br />
&nbsp;&nbsp;String sql = "select vw.timestamp,user.userName,vw.status,vw.amount,vw.accountType " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"from VWTransfer vw,User user where vw.userID=user.id and timestamp&gt;= '"+start +"' " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;" and timestamp&lt;='"+ end +"' "+" and vw.accountType=:accountType"<br />
<br />
</font><br />
</font></font></p>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/316664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-03-26 18:21 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/03/26/316664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate条件查询：投影 分组 聚合 离线查询 子查询</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/03/311809.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Wed, 03 Feb 2010 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/03/311809.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/311809.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/03/311809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/311809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/311809.html</trackback:ping><description><![CDATA[投影<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">List&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff">class</span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.rowCount()&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span style="color: #000000">"</span><span style="color: #000000">color</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;Color.BLACK)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />List&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff">class</span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.rowCount()&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.avg(</span><span style="color: #000000">"</span><span style="color: #000000">weight</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.max(</span><span style="color: #000000">"</span><span style="color: #000000">weight</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.groupProperty(</span><span style="color: #000000">"</span><span style="color: #000000">color</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">List&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff">class</span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.alias(&nbsp;Projections.groupProperty(</span><span style="color: #000000">"</span><span style="color: #000000">color</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">colr</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000">"</span><span style="color: #000000">colr</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />List&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff">class</span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.groupProperty(</span><span style="color: #000000">"</span><span style="color: #000000">color</span><span style="color: #000000">"</span><span style="color: #000000">).as(</span><span style="color: #000000">"</span><span style="color: #000000">colr</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000">"</span><span style="color: #000000">colr</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">DetachedCriteria&nbsp;dctr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DetachedCriteria.forClass(&nbsp;Affiliate.</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />dctr.setProjection(Property.forName(</span><span style="color: #000000">"</span><span style="color: #000000">trackerId</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />dctr.add(&nbsp;Restrictions.like(</span><span style="color: #000000">"</span><span style="color: #000000">affiliate</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;affiliate,&nbsp;MatchMode.ANYWHERE&nbsp;)&nbsp;);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />ctr.add(&nbsp;Subqueries.propertyIn(</span><span style="color: #000000">"</span><span style="color: #000000">trackerId</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;dctr));</span></div>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/311809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-03 15:17 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/03/311809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>