- 浏览: 293770 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
wangweiying123:
import com.sse.monitor.bean.Mes ...
一个项目看java TCP/IP Socket编程(1.3版) -
daxiaoli123:
求源码 448485223@qq.com
一个项目看java TCP/IP Socket编程(1.3版) -
jeromexf:
楼主,求源码,万分感谢(jeromexf@gmail.com) ...
一个项目看java TCP/IP Socket编程(1.3版) -
cuishen:
注意: 网上有人说IE8以下不支持Max-Age, 上面的代码 ...
Response Header Set-Cookie difference in cross browser -
zhunengfei:
刚接触socket,不是太明白,楼主的例子里面工具给的不是很全 ...
一个项目看java TCP/IP Socket编程(1.3版)
hibernate的O/R Mapping确实很强大,但是对于查询如果要使用hibernate的Query来实现,就必须先写好mapping,对于单个表还好办,但如果是复杂的多表连接查询的话就得写一大堆mapping和Entity,稍有疏漏就会出错,那hibernate有没有提供更简单的sql query接口呢?简单到仅仅需要写个sql,并提供一个Entity的包路径(当然这个Entity bean还是要程序员来实现的),执行.list()就能轻松将返回的每行记录注入Entity,最后结果集以list返回?从而解放了程序员繁重的劳动,使开发更加敏捷呢?
带着这个疑问我看了hibernate reference,看到hibernate提供session.createSQLQuery接口,似乎可以满足我的要求,好!让我来试试看,于是有了下面的代码:
说明下:dao是公司前辈封装的一个简单框架,同时支持jdbc和hibernate,对于Private.class,仅仅是个bean,并没有写hibernate mapping,测试发现抛了下面的异常:
于是我就mapping了一个简单的Entity,做了个简单的单表sql查询,如下:
说明下:将technicappindex表mapping为TechnicApp,测试通过了!看来hibernate的sql query还是不能完全脱离mapping
于是我修改了dao的代码,在jdbc返回结果集做封装的模块中加入了如下代码:
然后在dao里实现了新的接口:
哈哈,现在做多表连接查询简单多啦!
新加的代码是对jdbc的简单封装,并没有用到hibernate,代码还不够通用,以后还要改进。
如果工作地项目是糊弄人骗钱的,尽量使用吧!
要是以后自己使用,修改,运营,还是踏踏实实的作技术吧。
开发速度快,等价于“质量”差。
你凭什么说敏捷开发等价于质量差??
难道说一个项目拖的时间越长,质量就越好??
如果工作地项目是糊弄人骗钱的,尽量使用吧!
要是以后自己使用,修改,运营,还是踏踏实实的作技术吧。
开发速度快,等价于“质量”差。
下面是hibernate3.2.1的源代码:
兄台说我的setPOJO()方法效率低下,依据何在?是因为hibernate少做了强制类型转换??还是你经过了严格的性能测试得出的结论??还是你在拍脑袋???
确实是这个意思,但遗憾的是,用hibernate3.1.3实现的话,还是脱离不了mapping啊!
人云亦云!!!!
效率不高不知你是怎么推算出来的~~拍脑袋?
"hibernate本来就是民工用的"源于何处?
为什么说“有能力弄清楚的人是不屑用的”?
带着这个疑问我看了hibernate reference,看到hibernate提供session.createSQLQuery接口,似乎可以满足我的要求,好!让我来试试看,于是有了下面的代码:
public List<Private> getPublicIndex(String startDate, String endDate) throws SQLException { StringBuffer sql = new StringBuffer(); sql.append("select a.id as id, a.money as deposit, b.money as loan, c.money as loanleave, a.tdate as tdate") .append(" FROM publicindex a inner join publicindex b") .append(" on a.tdate = b.tdate and a.flag = '1' and b.flag = '2'") .append(" inner join publicindex c") .append(" on a.tdate = c.tdate and c.flag = '3'") .append(" where (a.tflag = 2 or a.tflag = 3 or a.tflag = 7) and") .append(" (b.tflag = 2 or b.tflag = 3 or b.tflag = 7) and") .append(" (c.tflag = 2 or c.tflag = 3 or c.tflag = 7) and") .append(" a.tdate >= to_date(?, 'yyyy-mm-dd') and") .append(" a.tdate <= to_date(?, 'yyyy-mm-dd')") .append(" order by a.tdate"); Session session = dao.openSession(); return session.createSQLQuery(sql.toString()).addEntity(Private.class).setParameter(0, startDate).setParameter(1, endDate).list(); }
说明下:dao是公司前辈封装的一个简单框架,同时支持jdbc和hibernate,对于Private.class,仅仅是个bean,并没有写hibernate mapping,测试发现抛了下面的异常:
org.hibernate.MappingException: Unknown entity: com.cuishen.edwview.pojo.Private
于是我就mapping了一个简单的Entity,做了个简单的单表sql查询,如下:
public List<TechnicApp> getTechnicApp(String date) throws SQLException { String sql = "select * from technicappindex t where t.tdate = to_date(?, 'yyyy-mm-dd')"; Session session = dao.openSession(); return session.createSQLQuery(sql).addEntity(TechnicApp.class).setParameter(0, date).list(); }
说明下:将technicappindex表mapping为TechnicApp,测试通过了!看来hibernate的sql query还是不能完全脱离mapping
于是我修改了dao的代码,在jdbc返回结果集做封装的模块中加入了如下代码:
/** * 反射POJO的setter方法,将记录中匹配的列值注入POJO,最后以List返回, * 在不区分大小写的情况下记录中的列名(加上'set'前缀)必须和POJO中的公有setter方法名一致, * 否则将不会被注入 * @param list 要返回的list * @param pojoClassName String 要注入的POJO的包路径, e.g 'com.cuishen.pojo.Cat' * @param rs ResultSet 待封装的原始结果集 */ private static void setPOJO(List list, String pojoClassName, ResultSet rs) { try { ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); // 查询的列数 Method [] methodsToInvoke = new Method[columnCount]; Class pojo = Class.forName(pojoClassName); Method [] methods = pojo.getMethods(); for(int i = 0; i < columnCount; i++) { for(int j = 0; j < methods.length; j++) { String methodName = methods[j].getName(); if(methodName.equalsIgnoreCase("set" + metaData.getColumnName(i + 1))) { methodsToInvoke[i] = methods[j]; log4j.debug(">>>>>> method name : " + methodsToInvoke[i].getName() + " para name : " + methodsToInvoke[i].getParameterTypes()[0].getName()); log4j.debug("======= >>>>>>> column name : " + metaData.getColumnName(i + 1) + " column type : " + metaData.getColumnClassName(i + 1)); break; } } } while(rs.next()) { Object obj = pojo.newInstance(); for(int i = 0; i < columnCount; i++) { methodsToInvoke[i].invoke(obj, new Object[]{castValue(rs.getObject(i + 1), methodsToInvoke[i].getParameterTypes()[0])}); } list.add(obj); } } catch (InstantiationException e) { e.printStackTrace(); log4j.error(e.getMessage(), e); } catch (IllegalAccessException e) { e.printStackTrace(); log4j.error(e.getMessage(), e); } catch (SQLException e) { e.printStackTrace(); log4j.error(e.getMessage(), e); } catch (IllegalArgumentException e) { e.printStackTrace(); log4j.error(e.getMessage(), e); } catch (InvocationTargetException e) { e.printStackTrace(); log4j.error(e.getMessage(), e); } catch (ClassNotFoundException e) { e.printStackTrace(); log4j.error(e.getMessage(), e); } } /** * 类型强制转换 * @param source * @param target * @return */ private static Object castValue(Object source, Class target) { if(source instanceof BigDecimal) { if(target == Long.class) return new Long(((BigDecimal)source).longValue()); else if(target == Integer.class) return new Integer(((BigDecimal)source).intValue()); else if(target == Short.class) return new Short(((BigDecimal)source).shortValue()); else if(target == Double.class) return new Double(((BigDecimal)source).doubleValue()); else if(target == Float.class) return new Float(((BigDecimal)source).floatValue()); } return source; }
然后在dao里实现了新的接口:
/** * jdbc sql查询,将记录注入POJO,结果集最终以list返回 * @param sql String sql语句 * @param params sql中的参数 * @param pojo String POJO的包路径 */ List sqlQueryAsPOJO(String sql, Object[] params, String pojo) throws SQLException;
哈哈,现在做多表连接查询简单多啦!
public List<Private> getPublicIndex(String startDate, String endDate) throws SQLException { StringBuffer sql = new StringBuffer(); sql.append("select a.id as id, a.money as deposit, b.money as loan, c.money as loanleave, a.tdate as tdate") .append(" FROM publicindex a inner join publicindex b") .append(" on a.tdate = b.tdate and a.flag = '1' and b.flag = '2'") .append(" inner join publicindex c") .append(" on a.tdate = c.tdate and c.flag = '3'") .append(" where (a.tflag = 2 or a.tflag = 3 or a.tflag = 7) and") .append(" (b.tflag = 2 or b.tflag = 3 or b.tflag = 7) and") .append(" (c.tflag = 2 or c.tflag = 3 or c.tflag = 7) and") .append(" a.tdate >= to_date(?, 'yyyy-mm-dd') and") .append(" a.tdate <= to_date(?, 'yyyy-mm-dd')") .append(" order by a.tdate"); return dao.sqlQueryAsPOJO(sql.toString(), new String[]{startDate, endDate}, "com.cuishen.edwview.pojo.Private"); }
新加的代码是对jdbc的简单封装,并没有用到hibernate,代码还不够通用,以后还要改进。
评论
23 楼
wuhoufeng
2009-12-14
2楼正解,直接使用sql是不受hibernate管理的,享受不到原本的一些好处。
22 楼
ldinh
2009-12-14
确实挺原始。感觉lz不应该拿出来和Hibernate一起说。
21 楼
cuishen
2009-12-14
xzh_endless 写道
如果工作地项目是糊弄人骗钱的,尽量使用吧!
要是以后自己使用,修改,运营,还是踏踏实实的作技术吧。
开发速度快,等价于“质量”差。
你凭什么说敏捷开发等价于质量差??
难道说一个项目拖的时间越长,质量就越好??
20 楼
xzh_endless
2009-12-13
如果工作地项目是糊弄人骗钱的,尽量使用吧!
要是以后自己使用,修改,运营,还是踏踏实实的作技术吧。
开发速度快,等价于“质量”差。
19 楼
cuishen
2009-12-10
hudefeifei1 写道
兄弟。你肯定没读过H的源码吧,看以下然后比较下setPOJO这个类的效率
下面是hibernate3.2.1的源代码:
package org.hibernate.transform; public class AliasToBeanResultTransformer implements ResultTransformer { public Object transformTuple(Object[] tuple, String[] aliases) { Object result; try { if(setters==null) { setters = new Setter[aliases.length]; for (int i = 0; i < aliases.length; i++) { String alias = aliases[i]; if(alias != null) { setters[i] = propertyAccessor.getSetter(resultClass, alias); } } } result = resultClass.newInstance(); for (int i = 0; i < aliases.length; i++) { if(setters[i]!=null) { setters[i].set(result, tuple[i], null); } } } catch (InstantiationException e) { throw new HibernateException("Could not instantiate resultclass: " + resultClass.getName()); } catch (IllegalAccessException e) { throw new HibernateException("Could not instantiate resultclass: " + resultClass.getName()); } return result; } }
package org.hibernate.property; public class ChainedPropertyAccessor implements PropertyAccessor { public Getter getGetter(Class theClass, String propertyName) throws PropertyNotFoundException { Getter result = null; for (int i = 0; i < chain.length; i++) { PropertyAccessor candidate = chain[i]; try { result = candidate.getGetter(theClass, propertyName); return result; } catch (PropertyNotFoundException pnfe) { // ignore } } throw new PropertyNotFoundException("Could not find getter for " + propertyName + " on " + theClass); } public Setter getSetter(Class theClass, String propertyName) throws PropertyNotFoundException { Setter result = null; for (int i = 0; i < chain.length; i++) { PropertyAccessor candidate = chain[i]; try { result = candidate.getSetter(theClass, propertyName); return result; } catch (PropertyNotFoundException pnfe) { // } } throw new PropertyNotFoundException("Could not find setter for " + propertyName + " on " + theClass); } }
package org.hibernate.property; public class BasicPropertyAccessor implements PropertyAccessor { public static final class BasicSetter implements Setter { public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException { try { method.invoke( target, new Object[] { value } ); } catch (NullPointerException npe) { //... //catch //... } } public Setter getSetter(Class theClass, String propertyName) throws PropertyNotFoundException { return createSetter(theClass, propertyName); } private static Setter createSetter(Class theClass, String propertyName) throws PropertyNotFoundException { BasicSetter result = getSetterOrNull(theClass, propertyName); if (result==null) { throw new PropertyNotFoundException( "Could not find a setter for property " + propertyName + " in class " + theClass.getName() ); } return result; } private static BasicSetter getSetterOrNull(Class theClass, String propertyName) { if (theClass==Object.class || theClass==null) return null; Method method = setterMethod(theClass, propertyName); if (method!=null) { if ( !ReflectHelper.isPublic(theClass, method) ) method.setAccessible(true); return new BasicSetter(theClass, method, propertyName); } else { BasicSetter setter = getSetterOrNull( theClass.getSuperclass(), propertyName ); if (setter==null) { Class[] interfaces = theClass.getInterfaces(); for ( int i=0; setter==null && i<interfaces.length; i++ ) { setter=getSetterOrNull( interfaces[i], propertyName ); } } return setter; } } private static Method setterMethod(Class theClass, String propertyName) { BasicGetter getter = getGetterOrNull(theClass, propertyName); Class returnType = (getter==null) ? null : getter.getReturnType(); Method[] methods = theClass.getDeclaredMethods(); Method potentialSetter = null; for (int i=0; i<methods.length; i++) { String methodName = methods[i].getName(); if ( methods[i].getParameterTypes().length==1 && methodName.startsWith("set") ) { String testStdMethod = Introspector.decapitalize( methodName.substring(3) ); String testOldMethod = methodName.substring(3); if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) { potentialSetter = methods[i]; if ( returnType==null || methods[i].getParameterTypes()[0].equals(returnType) ) { return potentialSetter; } } } } return potentialSetter; } public Getter getGetter(Class theClass, String propertyName) throws PropertyNotFoundException { return createGetter(theClass, propertyName); } public static Getter createGetter(Class theClass, String propertyName) throws PropertyNotFoundException { BasicGetter result = getGetterOrNull(theClass, propertyName); if (result==null) { throw new PropertyNotFoundException( "Could not find a getter for " + propertyName + " in class " + theClass.getName() ); } return result; } private static BasicGetter getGetterOrNull(Class theClass, String propertyName) { if (theClass==Object.class || theClass==null) return null; Method method = getterMethod(theClass, propertyName); if (method!=null) { if ( !ReflectHelper.isPublic(theClass, method) ) method.setAccessible(true); return new BasicGetter(theClass, method, propertyName); } else { BasicGetter getter = getGetterOrNull( theClass.getSuperclass(), propertyName ); if (getter==null) { Class[] interfaces = theClass.getInterfaces(); for ( int i=0; getter==null && i<interfaces.length; i++ ) { getter=getGetterOrNull( interfaces[i], propertyName ); } } return getter; } } private static Method getterMethod(Class theClass, String propertyName) { Method[] methods = theClass.getDeclaredMethods(); for (int i=0; i<methods.length; i++) { // only carry on if the method has no parameters if ( methods[i].getParameterTypes().length==0 ) { String methodName = methods[i].getName(); // try "get" if ( methodName.startsWith("get") ) { String testStdMethod = Introspector.decapitalize( methodName.substring(3) ); String testOldMethod = methodName.substring(3); if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) { return methods[i]; } } // if not "get" then try "is" /*boolean isBoolean = methods[i].getReturnType().equals(Boolean.class) || methods[i].getReturnType().equals(boolean.class);*/ if ( methodName.startsWith("is") ) { String testStdMethod = Introspector.decapitalize( methodName.substring(2) ); String testOldMethod = methodName.substring(2); if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) { return methods[i]; } } } } return null; } }
兄台说我的setPOJO()方法效率低下,依据何在?是因为hibernate少做了强制类型转换??还是你经过了严格的性能测试得出的结论??还是你在拍脑袋???
18 楼
mislay
2009-12-09
说了半天,这和hibernate有啥关系?? 利用sql的columnName,反射想要的bean。
17 楼
hudefeifei1
2009-12-09
兄弟。你肯定没读过H的源码吧,看以下然后比较下setPOJO这个类的效率
16 楼
BarryWei
2009-12-08
如果hibernate可以不用mapping配置而且能够同时支持多表连接那就舒服啦
可惜哦 不知道这样的思路是不是正确
可惜哦 不知道这样的思路是不是正确
15 楼
skyuck
2009-12-08
hibernate最主要的是解决阻抗不匹配的问题,Java是一个面向对象的语言,而我们平时用的数据库大多是关系型数据库,hibernate的O/R mapping就是从关系到对象的一种映射。
14 楼
wangdgsc
2009-12-07
如果不够用,就自己扩展,
13 楼
cuishen
2009-12-07
<div class="quote_title">mccxj 写道</div>
<div class="quote_div">
<p>可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。 </p>
<pre class="programlisting">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p>这个查询指定:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>SQL查询字符串</p>
</li>
<li>
<p>结果转换器(result transformer)</p>
</li>
</ul>
</div>
<p>上面的查询将会返回<tt class="literal">CatDTO</tt>的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。 </p>
<p> </p>
<p>from hibernate3.2文档 16.1.5. 返回非受管实体(Returning non-managed entities)</p>
<p> </p>
<p>我没用过这个。。不过看上面的解释应该是可以的~~同样,命名sql(不是命名hql)也可以达到这个目的</p>
<p> </p>
<p>其他:</p>
<p>1.任何时候hibernate都可以得到原生connection~~你的dao背后直接jdbc了?</p>
<p>2.虽然楼主似乎没搞清楚hibernate~不过楼主还不错~加油~~</p>
</div>
<p><br>本着勤学好问的精神,我试了一把,不错,hibernate3.2版的</p>
<p> </p>
<pre name="code" class="java">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p> </p>
<p>确实可以基本达到我的要求,但是非常不好用(至少hibernate3.2是这样,不知3.3版有没有改进):</p>
<p> </p>
<p>1. 没有做到setter方法大小写不敏感,举例来说:比如bean里面有属性id,setter方法名是setId,sql语句是“select id from ...”,明显的ResultSetMetaData中取出的ColumnName应该是大写的“ID”,遗憾的是hibernate并没有做到大小写不敏感,也去反射了setID方法,后果可想而知</p>
<p> </p>
<p>2. 反射setter方法的参数没有做到强制类型转换,ResultSet拿到的值是怎样的对象,它就set怎样的对象</p>
<div class="quote_div">
<p>可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。 </p>
<pre class="programlisting">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p>这个查询指定:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>SQL查询字符串</p>
</li>
<li>
<p>结果转换器(result transformer)</p>
</li>
</ul>
</div>
<p>上面的查询将会返回<tt class="literal">CatDTO</tt>的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。 </p>
<p> </p>
<p>from hibernate3.2文档 16.1.5. 返回非受管实体(Returning non-managed entities)</p>
<p> </p>
<p>我没用过这个。。不过看上面的解释应该是可以的~~同样,命名sql(不是命名hql)也可以达到这个目的</p>
<p> </p>
<p>其他:</p>
<p>1.任何时候hibernate都可以得到原生connection~~你的dao背后直接jdbc了?</p>
<p>2.虽然楼主似乎没搞清楚hibernate~不过楼主还不错~加油~~</p>
</div>
<p><br>本着勤学好问的精神,我试了一把,不错,hibernate3.2版的</p>
<p> </p>
<pre name="code" class="java">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p> </p>
<p>确实可以基本达到我的要求,但是非常不好用(至少hibernate3.2是这样,不知3.3版有没有改进):</p>
<p> </p>
<p>1. 没有做到setter方法大小写不敏感,举例来说:比如bean里面有属性id,setter方法名是setId,sql语句是“select id from ...”,明显的ResultSetMetaData中取出的ColumnName应该是大写的“ID”,遗憾的是hibernate并没有做到大小写不敏感,也去反射了setID方法,后果可想而知</p>
<p> </p>
<p>2. 反射setter方法的参数没有做到强制类型转换,ResultSet拿到的值是怎样的对象,它就set怎样的对象</p>
12 楼
mccxj
2009-12-07
<div class="quote_title">cuishen 写道</div>
<div class="quote_div">
<div class="quote_title">mccxj 写道</div>
<div class="quote_div">
<p>可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。 </p>
<pre class="programlisting">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p>这个查询指定:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>SQL查询字符串</p>
</li>
<li>
<p>结果转换器(result transformer)</p>
</li>
</ul>
</div>
<p>上面的查询将会返回<tt class="literal">CatDTO</tt>的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。 </p>
<p> </p>
<p>from hibernate3.2文档 16.1.5. 返回非受管实体(Returning non-managed entities)</p>
<p> </p>
<p>我没用过这个。。不过看上面的解释应该是可以的~~同样,命名sql(不是命名hql)也可以达到这个目的</p>
<p> </p>
<p>其他:</p>
<p>1.任何时候hibernate都可以得到原生connection~~你的dao背后直接jdbc了?</p>
<p>2.虽然楼主似乎没搞清楚hibernate~不过楼主还不错~加油~~</p>
</div>
<p>首先谢谢热心的网友批评指正,我特意看了下我看的hibernate的版本是3.1.3的,属于比较老旧的版本了,所以没有提供这个功能,大家可以去翻hibernate reference3.1.3,我又下载了3.2版本的reference,确实有16.1.5这个章节,这应该是新加进去的</p>
</div>
<p>看来这个贴有给投成新手的趋势~~~楼主下次还是把版本也给注明的比较好~</p>
<div class="quote_div">
<div class="quote_title">mccxj 写道</div>
<div class="quote_div">
<p>可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。 </p>
<pre class="programlisting">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p>这个查询指定:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>SQL查询字符串</p>
</li>
<li>
<p>结果转换器(result transformer)</p>
</li>
</ul>
</div>
<p>上面的查询将会返回<tt class="literal">CatDTO</tt>的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。 </p>
<p> </p>
<p>from hibernate3.2文档 16.1.5. 返回非受管实体(Returning non-managed entities)</p>
<p> </p>
<p>我没用过这个。。不过看上面的解释应该是可以的~~同样,命名sql(不是命名hql)也可以达到这个目的</p>
<p> </p>
<p>其他:</p>
<p>1.任何时候hibernate都可以得到原生connection~~你的dao背后直接jdbc了?</p>
<p>2.虽然楼主似乎没搞清楚hibernate~不过楼主还不错~加油~~</p>
</div>
<p>首先谢谢热心的网友批评指正,我特意看了下我看的hibernate的版本是3.1.3的,属于比较老旧的版本了,所以没有提供这个功能,大家可以去翻hibernate reference3.1.3,我又下载了3.2版本的reference,确实有16.1.5这个章节,这应该是新加进去的</p>
</div>
<p>看来这个贴有给投成新手的趋势~~~楼主下次还是把版本也给注明的比较好~</p>
11 楼
cuishen
2009-12-07
kjj 写道
大家这么一评论,我发现作者是不是说的是这个意思
"select new UnMappingEntiry() from User u join Department d where d.userid=u.id"
确实是这个意思,但遗憾的是,用hibernate3.1.3实现的话,还是脱离不了mapping啊!
10 楼
cuishen
2009-12-07
<div class="quote_title">mccxj 写道</div>
<div class="quote_div">
<p>可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。 </p>
<pre class="programlisting">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p>这个查询指定:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>SQL查询字符串</p>
</li>
<li>
<p>结果转换器(result transformer)</p>
</li>
</ul>
</div>
<p>上面的查询将会返回<tt class="literal">CatDTO</tt>的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。 </p>
<p> </p>
<p>from hibernate3.2文档 16.1.5. 返回非受管实体(Returning non-managed entities)</p>
<p> </p>
<p>我没用过这个。。不过看上面的解释应该是可以的~~同样,命名sql(不是命名hql)也可以达到这个目的</p>
<p> </p>
<p>其他:</p>
<p>1.任何时候hibernate都可以得到原生connection~~你的dao背后直接jdbc了?</p>
<p>2.虽然楼主似乎没搞清楚hibernate~不过楼主还不错~加油~~</p>
</div>
<p>首先谢谢热心的网友批评指正,我特意看了下我看的hibernate的版本是3.1.3的,属于比较老旧的版本了,所以没有提供这个功能,大家可以去翻hibernate reference3.1.3,我又下载了3.2版本的reference,确实有16.1.5这个章节,这应该是新加进去的</p>
<div class="quote_div">
<p>可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。 </p>
<pre class="programlisting">sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))</pre>
<p>这个查询指定:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>SQL查询字符串</p>
</li>
<li>
<p>结果转换器(result transformer)</p>
</li>
</ul>
</div>
<p>上面的查询将会返回<tt class="literal">CatDTO</tt>的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。 </p>
<p> </p>
<p>from hibernate3.2文档 16.1.5. 返回非受管实体(Returning non-managed entities)</p>
<p> </p>
<p>我没用过这个。。不过看上面的解释应该是可以的~~同样,命名sql(不是命名hql)也可以达到这个目的</p>
<p> </p>
<p>其他:</p>
<p>1.任何时候hibernate都可以得到原生connection~~你的dao背后直接jdbc了?</p>
<p>2.虽然楼主似乎没搞清楚hibernate~不过楼主还不错~加油~~</p>
</div>
<p>首先谢谢热心的网友批评指正,我特意看了下我看的hibernate的版本是3.1.3的,属于比较老旧的版本了,所以没有提供这个功能,大家可以去翻hibernate reference3.1.3,我又下载了3.2版本的reference,确实有16.1.5这个章节,这应该是新加进去的</p>
9 楼
kjj
2009-12-07
whaosoft 写道
hibernate就是jdbc的封装,处理负责的sql查询,效率就不高啦
人云亦云!!!!
8 楼
mycybyb
2009-12-07
hibernate是不是有人工智能啊,效率比手工打造的SQL还高
7 楼
mccxj
2009-12-07
whaosoft 写道
hibernate就是jdbc的封装,处理负责的sql查询,效率就不高啦
效率不高不知你是怎么推算出来的~~拍脑袋?
6 楼
rmn190
2009-12-07
fuwang 写道
弄清楚hibernate的人极少,
hibernate本来就是民工用的,有能力弄清楚的人是不屑用的。
所以现状就是:使用hibernate的人都不懂hibernate
hibernate本来就是民工用的,有能力弄清楚的人是不屑用的。
所以现状就是:使用hibernate的人都不懂hibernate
"hibernate本来就是民工用的"源于何处?
为什么说“有能力弄清楚的人是不屑用的”?
5 楼
whaosoft
2009-12-06
hibernate就是jdbc的封装,处理负责的sql查询,效率就不高啦
4 楼
kjj
2009-12-06
大家这么一评论,我发现作者是不是说的是这个意思
"select new UnMappingEntiry() from User u join Department d where d.userid=u.id"
发表评论
-
Response Header Set-Cookie difference in cross browser
2014-07-02 21:26 8324如果你项目中需要在server端把cookie写回client ... -
struts1 redirect issue
2014-05-08 23:04 1282近日突然发现struts1 的redirect有很大的限制,它 ... -
Cookie 和 sessionStorage的区别
2014-03-18 23:21 1427expire设为null的cookie是session sco ... -
http https get post 的区别,定义/安全性/性能
2014-02-20 18:19 14575HTTP / HTTPS request 的 get / po ... -
struts1的tiles导致的response cache无法禁止的issue
2014-02-15 00:13 1448近日struts 1项目中遇到一个很怪异的问题,项目中的所有. ... -
XFS攻击一例
2013-08-13 17:50 5932XFS: Cross Frame Script (跨框架脚本) ... -
XSS攻击一例
2013-08-12 17:55 1735XSS 全称(Cross Site Scripting) 跨站 ... -
maven3 compile failed, class file not found issue
2013-07-16 18:31 1385今日maven3 build 老是失败,停在compile,报 ... -
maven plugin for eclipse 3.6+
2013-07-04 18:24 1095this for eclipse 3.6 down http: ... -
JQuery异步提交表单在Firefox button onclick事件下可能导致重复提交
2013-06-04 19:58 4815当我们处理button的onclick事件时,在onclick ... -
AJAX JQuery 提交表单乱码问题解决方案
2012-10-16 13:59 13611最近遇到AJAX/JQuery 提交form表单出现乱码的问题 ... -
hibernate多对多级联删除总结
2010-04-02 07:46 3522A. 应用场景: 一个简单的权限系统的例子: 有三张主表: ... -
iBATIS一对多/多对多N+1问题解决方案
2009-12-08 17:53 13085对于iBATIS一对多/多对多的问题,传统的办法是在一对多/多 ... -
Apache_WebLogic9.2.2安装及集群、SSL配置手册
2009-10-09 17:27 1492Apache_WebLogic9.2.2安装及集群、SSL配置 ... -
浅析Java web程序之客户端和服务器端交互原理
2009-09-16 21:18 47041. 协议 a. TCP/IP整体构 ... -
spring aop 事务配置总结
2009-08-06 13:47 5553以下配置基于spring 1x ... -
从源代码解读spring之DataSource实现和FactoryBean模式
2009-07-22 13:25 7929大家平日使用spring + hibernate做项目的时候大 ... -
从源代码解读hibernate之数据库连接
2009-07-17 15:59 3694大家都知道hibernate是在JDBC基础上的封装,那么它的 ... -
AIX环境下JDK1.5 + WebLogic9.2.2安装配置手册
2009-01-22 13:15 2316项目中用到: 服务器:IBM 64位 小型机 操作系统:AI ... -
从源代码解读spring IOC容器
2008-09-19 09:43 3948spring IOC容器(Inversion of Contr ...
相关推荐
理解典型的三层架构,如何用O/R Mapping框架来实现我们的数据层。这里主要介绍现在非常流程的Hibernate框架,,掌握Hibernate相关的概念;并如何做对象和关系的映射,如何在应用中使用Hibernate
Hibernate 快速入门的工程包 包括用xml和annotation映射数据表
2 Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 3 常见的0/R框架(了解) 4 hibernate基础配置(重点) 5 ID生成策略(重点 AUTO) 6 Hibernate核心开发接口介绍(重点) ... 风格 1 ...
hibernate基础教程 理解O/R Mapping原理 掌握Hibernate开发的相关知识 能使用Hibernate进行实际项目开发
一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践
2 Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 5 3 常见的0/R框架(了解) 5 4 hibernate基础配置(重点) 5 5 ID生成策略(重点 AUTO) 5 6 Hibernate核心开发接口介绍(重点) 5 7 对象的三种...
hibernate java o/r mapping
一、O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、Hibernate Annotations 五、持久化对象的状态和生命周期 六、Hibernate查询 七、Hibernate最佳实践 八、Hibernate Tool
Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,...
Hibernate 培训课件 一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践
理解O/R Mapping原理 掌握Hibernate开发的相关知识 能使用Hibernate进行实际项目开发 Hibernate高手进级:性能优化策略
在Hibernate部分主要讲解O/R Mapping的设计理念,Hibernate对O/R Mapping的支持,Hibernate的配置及多种关系映射的实现,以及HQL查询数据。在Spring部分主要讲解IoC的原理,Spring对Bean的管理机制,Spring AOP编程...
对象-关系映射—Hibernate 培训 (中文) ...一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践
目录 一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践
第8课 什么是O/R Mapping 11 一、 定义: 11 二、 Hibernate的创始人: 11 三、 Hibernate做什么: 12 四、 Hibernate存在的原因: 12 五、 Hibernate的优缺点: 12 六、 Hibernate使用范围: 12 第9课 Hibernate的...
也是一个轻量级的O/R Mapping框架,它问世的时间并不长,但已经成为目前最流行的持久层解决方案。 它使得程序与数据库的交互变得十分容易,更加符合面向对象的设计思想,像数据库中包含普通Java对象一样,而不必考虑...
公司的大部分项目都开始使用IBatis作为O/R Mapping了,但是在使用的过程中也发现了很多不方便和存在争议的地方,其中一个不方便的地方就是分页,目前的处理方式都是在sqlMap中写针对特定数据库的物理分页Sql语句,对于...
我培训用的 Hibernate课件, 个人能力范围内精心整理,图文并茂. 希望能对大家学习 Hibernate 提供帮助... 了解持久化层-O/R Mapping ;理解Java持久化层技术Hibernate; 学习Hibernate的开发步骤;学习Hibernate的重要接口
软件设计课做的一个类似Hibernate的O/R Mapping的框架