﻿<?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-梦在脚下-文章分类-Hibernate</title><link>http://www.blogjava.net/J2EE/category/32941.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 01 Jul 2009 21:20:42 GMT</lastBuildDate><pubDate>Wed, 01 Jul 2009 21:20:42 GMT</pubDate><ttl>60</ttl><item><title>hibernate中文乱码</title><link>http://www.blogjava.net/J2EE/articles/284779.html</link><dc:creator>追梦人</dc:creator><author>追梦人</author><pubDate>Tue, 30 Jun 2009 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/J2EE/articles/284779.html</guid><wfw:comment>http://www.blogjava.net/J2EE/comments/284779.html</wfw:comment><comments>http://www.blogjava.net/J2EE/articles/284779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/J2EE/comments/commentRss/284779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/J2EE/services/trackbacks/284779.html</trackback:ping><description><![CDATA[注意指定编码，不然郁闷别找我<br />
&nbsp;&nbsp;&lt;property name="url"<br />
&nbsp;&nbsp;&nbsp;value="jdbc:mysql://localhost/struts?useUnicode=true&amp;characterEncoding=gb2312"&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
<img src ="http://www.blogjava.net/J2EE/aggbug/284779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/J2EE/" target="_blank">追梦人</a> 2009-06-30 15:34 <a href="http://www.blogjava.net/J2EE/articles/284779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate注释 属性不持久化到数据库</title><link>http://www.blogjava.net/J2EE/articles/256460.html</link><dc:creator>追梦人</dc:creator><author>追梦人</author><pubDate>Tue, 24 Feb 2009 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/J2EE/articles/256460.html</guid><wfw:comment>http://www.blogjava.net/J2EE/comments/256460.html</wfw:comment><comments>http://www.blogjava.net/J2EE/articles/256460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/J2EE/comments/commentRss/256460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/J2EE/services/trackbacks/256460.html</trackback:ping><description><![CDATA[@Transient<br />
该死的，找了一下午，终于死出来了！
<img src ="http://www.blogjava.net/J2EE/aggbug/256460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/J2EE/" target="_blank">追梦人</a> 2009-02-24 16:37 <a href="http://www.blogjava.net/J2EE/articles/256460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Hibernate]Hibernate 3.2: Transformers for HQL and SQL</title><link>http://www.blogjava.net/J2EE/articles/214048.html</link><dc:creator>追梦人</dc:creator><author>追梦人</author><pubDate>Thu, 10 Jul 2008 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/J2EE/articles/214048.html</guid><wfw:comment>http://www.blogjava.net/J2EE/comments/214048.html</wfw:comment><comments>http://www.blogjava.net/J2EE/articles/214048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/J2EE/comments/commentRss/214048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/J2EE/services/trackbacks/214048.html</trackback:ping><description><![CDATA[People using the Criteria API have either transparently or knowingly used a <a onclick="showLinkBubble(this);return false" href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/transform/ResultTransformer.html" target="_blank" link="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/transform/ResultTransformer.html"><font style="line-height: 1.3em" color="#a8341a">ResultTransformer</font><wbr></a><wbr>. A ResultTransformer is a nice and simple interface that allows you to transform any Criteria result element. E.g. you can make any Criteria result be returned as a java.util.Map or as a non-entity Bean. <br />
<br />
Criteria TransformersImagine you have a StudentDTO class: <br />
public class StudentDTO <br />
{&nbsp;&nbsp;<br />
&nbsp;&nbsp; private String studentName;&nbsp;&nbsp;<br />
&nbsp;&nbsp; private String courseDescription;&nbsp;&nbsp; <br />
&nbsp;&nbsp; public StudentDTO() {&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; ...<br />
} <br />
Then you can make the Criteria return non-entity classes instead of scalars or entities by applying a ResultTransformer: <br />
<br />
List resultWithAliasedBean = s.createCriteria(Enrolment.class) <br />
&nbsp;&nbsp;&nbsp;&nbsp; .createAlias("student", "st").createAlias("course", "co") <br />
&nbsp;&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add( Projections.property("st.name"), "studentName" )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add( Projections.property("co.description"), "courseDescription" )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; .setResultTransformer( Transformers.aliasToBean(StudentDTO.class) )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.list(); <br />
StudentDTO dto = (StudentDTO)resultWithAliasedBean.get(0);&nbsp;&nbsp; <br />
<br />
This is how ResultTransformer have been available since we introduced <a onclick="showLinkBubble(this);return false" href="http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#querycriteria-projection" target="_blank" link="http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#querycriteria-projection"><font style="line-height: 1.3em" color="#a8341a">projection</font><wbr></a><wbr> to the Criteria API in Hibernate 3. <br />
It is just one example of the built in transformers and users can provide their own transformers if they so please. <br />
Jealous programming Since I am more a HQL/SQL guy I have been jealous on Criteria for having this feature and I have seen many requests for adding it to all our query facilities. <br />
Today I put an end to this jealousy and introduced ResultTransformer for HQL and SQL in Hibernate 3.2. <br />
HQL TransformersIn HQL we already had a "kind" of result transformers via the ("select new" <a onclick="showLinkBubble(this);return false" href="http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html#queryhql-select" target="_blank" link="http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html#queryhql-select"><font style="line-height: 1.3em" color="#a8341a">http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html#queryhql-select</font><wbr></a><wbr>) syntax, but for returning non-entity beans it only provided value injection of these beans via its constructor. Thus if you used the same DTO in many different scenarios you could end up having many constructors on this DTO purely for allowing the "select new" functionality to work. <br />
Now you can get the value injected via property methods or fields instead, removing the need for explicit constructors. <br />
<br />
List resultWithAliasedBean = s.createQuery(&nbsp;&nbsp;"select e.student.name as studentName," +&nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.course.description as courseDescription" +&nbsp;&nbsp;"from&nbsp;&nbsp; Enrolment as e") <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))&nbsp;&nbsp;.list();<br />
<br />
StudentDTO dto = (StudentDTO) resultWithAliasedBean.get(0); <br />
<br />
　　<br />
SQL TransformersWith native sql returning non-entity beans or Map's is often more useful instead of basic Object[]. With result transformers that is now possible. <br />
<br />
List resultWithAliasedBean = s.createSQLQuery(&nbsp;&nbsp;"SELECT st.name as studentName, co.description as courseDescription " +&nbsp;&nbsp;"FROM Enrolment e " +&nbsp;&nbsp;"INNER JOIN Student st on e.studentId=st.studentId " +&nbsp;&nbsp;"INNER JOIN Course co on e.courseCode=co.courseCode") <br />
&nbsp;&nbsp;&nbsp;&nbsp; .addScalar("studentName")&nbsp;&nbsp;.addScalar("courseDescription")<br />
&nbsp;&nbsp;&nbsp;&nbsp; .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0); <br />
<br />
　　<br />
Tip: the addScalar() calls were required on HSQLDB to make it match a property name since it returns column names in all uppercase (e.g. "STUDENTNAME"). This could also be solved with a custom transformer that search the property names instead of using exact match - maybe we should provide a fuzzyAliasToBean() method ;) <br />
Map vs. Object[]Since you can also use a transformer that return a Map from alias to value/entity (e.g. Transformers.ALIAS_TO_MAP), you are no longer required to mess with index based Object arrays when working with a result. <br />
<br />
List iter = s.createQuery(&nbsp;&nbsp;"select e.student.name as studentName," +&nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.course.description as courseDescription" +&nbsp;&nbsp;"from&nbsp;&nbsp; Enrolment as e") <br />
&nbsp;&nbsp;&nbsp;&nbsp; .setResultTransformer( Transformers.ALIAS_TO_MAP )&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; .iterate();<br />
<br />
String name = (Map)(iter.next()).get("studentName"); <br />
<br />
　　<br />
Again, this works equally well for Criteria, HQL and native SQL.<br />
&nbsp;<br />
<br />
<p>使用SQLQuery<br />
对原生SQL查询执行的控制是通过SQLQuery接口进行的，通过执行Session.createSQLQuery()获取这个接口。最简单的情况下，我们可以采用以下形式：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">List cats </span><span style="color: #000000">=</span> <span style="color: #000000">sess.createSQLQuery(</span> <span style="color: #000000">"</span> <span style="color: #000000">select * from cats</span> <span style="color: #000000">"</span> <span style="color: #000000">).addEntity(Cat.</span> <span style="color: #0000ff">class</span> <span style="color: #000000">).list();</span></div>
<p>这个查询指定了:</p>
<p>SQL查询字符串</p>
<p>查询返回的实体</p>
<p>这里，结果集字段名被假设为与映射文件中指明的字段名相同。对于连接了多个表的查询，这就可能造成问题，因为可能在多个表中出现同样名字的字段。下面的方法就可以避免字段名重复的问题:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">List cats </span><span style="color: #000000">=</span> <span style="color: #000000">sess.createSQLQuery(</span> <span style="color: #000000">"</span> <span style="color: #000000">select {cat.*} from cats cat</span> <span style="color: #000000">"</span> <span style="color: #000000">).addEntity(</span> <span style="color: #000000">"</span> <span style="color: #000000">cat</span> <span style="color: #000000">"</span> <span style="color: #000000">, Cat.</span> <span style="color: #0000ff">class</span> <span style="color: #000000">).list();</span></div>
<p>这个查询指定了:</p>
<p>SQL查询语句，它带一个占位符，可以让Hibernate使用字段的别名.</p>
<p>查询返回的实体，和它的SQL表的别名.</p>
<p>addEntity()方法将SQL表的别名和实体类联系起来，并且确定查询结果集的形态。</p>
<p>addJoin()方法可以被用于载入其他的实体和集合的关联.</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">List cats </span><span style="color: #000000">=</span> <span style="color: #000000">sess.createSQLQuery(<br />
</span><span style="color: #000000">"</span> <span style="color: #000000">select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id</span> <span style="color: #000000">"</span> <span style="color: #000000">)<br />
.addEntity(</span> <span style="color: #000000">"</span> <span style="color: #000000">cat</span> <span style="color: #000000">"</span> <span style="color: #000000">, Cat.</span> <span style="color: #0000ff">class</span> <span style="color: #000000">)<br />
.addJoin(</span> <span style="color: #000000">"</span> <span style="color: #000000">kitten</span> <span style="color: #000000">"</span> <span style="color: #000000">, </span><span style="color: #000000">"</span> <span style="color: #000000">cat.kittens</span> <span style="color: #000000">"</span> <span style="color: #000000">)<br />
.list();</span></div>
<p>原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">Double max </span><span style="color: #000000">=</span> <span style="color: #000000">(Double) sess.createSQLQuery(</span> <span style="color: #000000">"</span> <span style="color: #000000">select max(cat.weight) as maxWeight from cats cat</span> <span style="color: #000000">"</span> <span style="color: #000000">)<br />
.addScalar(</span> <span style="color: #000000">"</span> <span style="color: #000000">maxWeight</span> <span style="color: #000000">"</span> <span style="color: #000000">, Hibernate.DOUBLE);<br />
.uniqueResult();</span></div>
<p>除此之外，你还可以在你的hbm文件中描述结果集映射信息，在查询中使用。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">List cats </span><span style="color: #000000">=</span> <span style="color: #000000">sess.createSQLQuery(<br />
</span><span style="color: #000000">"</span> <span style="color: #000000">select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id</span> <span style="color: #000000">"</span> <span style="color: #000000">)<br />
.setResultSetMapping(</span> <span style="color: #000000">"</span> <span style="color: #000000">catAndKitten</span> <span style="color: #000000">"</span> <span style="color: #000000">)<br />
.list();</span></div>
<p>命名SQL查询<br />
可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们不 需要调用addEntity()方法.</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;</span> <span style="color: #000000">sql</span> <span style="color: #000000">-</span> <span style="color: #000000">query name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">persons</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #000000">&lt;</span> <span style="color: #0000ff">return</span> <span style="color: #000000">alias</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">person</span> <span style="color: #000000">"</span> <span style="color: #0000ff">class</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">eg.Person</span> <span style="color: #000000">"</span> <span style="color: #000000">/&gt;</span> <span style="color: #000000"><br />
Select person.NAME AS {person.name},person.AGE AS {person.age},person.SEX AS {person.sex} FROM PERSON person Where person.NAME LIKE :namePattern<br />
</span><span style="color: #000000">&lt;/</span> <span style="color: #000000">sql</span> <span style="color: #000000">-</span> <span style="color: #000000">query</span> <span style="color: #000000">&gt;</span></div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">List people </span><span style="color: #000000">=</span> <span style="color: #000000">sess.getNamedQuery(</span> <span style="color: #000000">"</span> <span style="color: #000000">persons</span> <span style="color: #000000">"</span> <span style="color: #000000">).setString(</span> <span style="color: #000000">"</span> <span style="color: #000000">namePattern</span> <span style="color: #000000">"</span> <span style="color: #000000">, namePattern)<br />
.setMaxResults(</span> <span style="color: #000000">50</span> <span style="color: #000000">)<br />
.list();</span></div>
<img src ="http://www.blogjava.net/J2EE/aggbug/214048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/J2EE/" target="_blank">追梦人</a> 2008-07-10 17:39 <a href="http://www.blogjava.net/J2EE/articles/214048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>