请帮忙讲解一下HIBERNATE对原生SQL的处理
发布网友
发布时间:2022-10-13 17:52
我来回答
共1个回答
热心网友
时间:2023-11-07 13:16
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。最简单的情况下,我们可以采用以下形式:
List cats = sess.createSQLQuery("select * from cats")
.addEntity(Cat.class)
.list();
这个查询指定了:
SQL查询字符串
查询返回的实体
这里,结果集字段名被假设为与映射文件中指明的字段名相同。对于连接了多个表的查询,这就可能造成问题,因为可能在多个表中出现同样名字的字段。下面的方法就可以避免字段名重复的问题:
List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class)
.list();
这个查询指定了:
SQL查询语句,它带一个占位符,可以让Hibernate使用字段的别名.
查询返回的实体,和它的SQL表的别名.
addEntity()方法将SQL表的别名和实体类联系起来,并且确定查询结果集的形态。
addJoin()方法可以被用于载入其他的实体和集合的关联.
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.addEntity("cat", Cat.class)
.addJoin("kitten", "cat.kittens")
.list();
原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。
Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE);
.uniqueResult();
除此之外,你还可以在你的hbm文件中描述结果集映射信息,在查询中使用。
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.setResultSetMapping("catAndKitten")
.list();
请教Hibernate中CriteriaQuery可以使用原生sql作为排序条件么_百度知 ...
Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的,这种方式弥补了HQL、Criterion查询的不足,在操作和使用上往往更加的自由和灵活,如果使用得当,数据库操作的效率还会得到不同程度的提升。 Hibernate对原生 SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQu...
[极品难]关于hibernate如何把原生sql查出的结果转化为对象
原生sql可以用query.setResultTransformer(Transformers.aliasToBean(XXX.class));这个类不需要映射字段与表列名对应
hibernate原生sql查询单列返回的是什么
其实是没有具体的返回的,执行的结果是org.hibernate.impl.SQLQueryImpl,根据你对返回结果的逻辑来决定你返回的类型,比如java.util.List,调用它的list()方法,调用iterater方法则返回java.util.Iterator.返回String则调用SQLQueryImpl的父类AbstractQueryImpl的getQueryString()......
hibernter执行sql语句
就算是SSH框架中hibernate的执行语句,也要是完整的正确的sql语句,即使是HQL语句,也是根据类的映射来查找的,也没有这样取别名的规则。主要是不明白as {hh.id} 你是想做什么,as 是用来取别名的 但别名的规则是不能这样的 。你可以把你这个语句的思想说一下 ...
Hibernate3 使用原生sql 返回集能用hbm.xml配置文件映射到类里吗?_百...
l uuid.string:与uuid.hex类似,只是对生成的主键进行编码(长度为16位)。在某些数据库中可能出现问题。l foreign:使用外部表的字段作为主键。该主键一般应用在表与表之间的关系上,会在后面的表对应关系上进一步讲解。l select:Hibernate 3新引入的主键生成机制,主要针对遗留系统的改造工程。由于常用...
hibernate 将结果封装成map
原生SQL查询 以下代码功能:Hibernate执行原生SQL返回List类型结果集 //获得session对象Session session = super.getSession();//创建sql语句String sql = "SELECT users.name,usersinfo.* FROM users,usersinfo WHERE users.id = usersinfo.userid";//获得SQLQuery对象SQLQuery query = session.createSQL...
如何理解hibernate当中的锁机制
当运行后,我们通过show_sql可以看见,原生的sql语句仍然在最后面加上了for update,可以看出hibernate通过数据库的for update自己来实现了悲观锁的机制。Hibernate的加锁模式则分为:LockMode.NONE:无锁 LockMode.WRITE:hibernate在insert和update记录的时候会自动获取 LockMode.READ: hibernate在读取数据的时候会自动获取...
nHibenate 如果只使用原生sql语句后,还能支持多种数据库吗
绝对不可以。自己写sql就相当于重写了hibernate提供的支持多数据库语言的方法。如果是语法相近的数据库还是可以的
hibernate怎么调用mysql中的year,month,concat等函数
如MSSQL 的 T-SQL,这时,就需要使用 hibernate 对 SQL 的原生支持,Session 提供了 createSQLQuery() 这样的方法,此时的 hibernate 就相当于一个简单的 mapper,只提供对象关系映射,当然,一旦你在代码中使用了对 SQL 的原生支持,移植性就不好了。此种方式可以使用你所说的 MySQL 函数 ...
怎么用hibernate获取数据库的当前时间
你的意思是不是说你想取出数据库服务器的当前时间,如果是要取出数据库服务器的当前时间,你可以先使用sql函数取出数据库当前时间赛select getdate() 直接就查询出数据库服务器的当前时间,后面的就不用说了吧。你直接使用hibernate执行原生sql的方式获取这个时间就好了。