Hibernate 本地sql查询问题

natty_boy 2008-10-09 05:42:26
List cats = sess.createSQLQuery( " select * from cats " ).addEntity(Cat. class ).list();
用以上方式查询时,Cat.class 需要在 hbm.xml 文件中配置吗
还是只要写一个普通的POJO就OK了
...全文
289 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joe_n 2011-09-08
  • 打赏
  • 举报
回复
// Query query = this.getSession().getNamedQuery("detilQuery");
// query.setLong(0, id);
// List result = query.list();
// Iterator it = result.iterator();
// while (it.hasNext()) {
// Object[] results = (Object[]) it.next();
// Bid bid = (Bid) results[0];
// tender = (Tender) results[1];
// }
各位帮忙看看,一对数组怎么在页面上接收呢
ancky_zhang 2008-10-15
  • 打赏
  • 举报
回复
好像hibernate 只能 查询对象吧,不能查询字段。 不能用 sql 要用 hql 。。。。。另外还要配置 Cat.hbm.xml 文件 和表对应。
natty_boy 2008-10-14
  • 打赏
  • 举报
回复
谢了,不想在纠缠这个问题了
[img]http://wpa.qq.com/pa?p=1:258441778:1[/img]点击这里给我发消息
tongdayong1981 2008-10-13
  • 打赏
  • 举报
回复
我自己都晕了,上面的事hql.

应该这样

<sql-query name="PriceFilesByProduct">
<return alias="priceFile" class="com.risi.model.content.data.PriceFile"/>
SELECT * FROM price_files f,
price_files_products fp
WHERE fp.product_id = :productId
AND fp.price_file_id = f.id
</sql-query>

*你用相关的字段来代替并加上as 'name' 然后类中属性名称为name

你往这个方向再试试,关键长时间不用都有点忘了
tongdayong1981 2008-10-13
  • 打赏
  • 举报
回复
上面应该是不行的,应该用上面我说的第三种方法

select new clsObj(tabA.aa ,tabA.bb,tabB.xx,tabB.yy )from tabA,tabB where tabA.id = tabB.id

tongdayong1981 2008-10-13
  • 打赏
  • 举报
回复
因为我现在项目缠身,所以没空帮你写例子,你配置在hbm.xml中,一般会放在相关的业务的hbm中,比如PriceFile.hbm.xml中

当然按理来说是可以随便放在那个hbm中,因为load的时候是一起加载到内存的,当然一般不会这样,会被老大k死的

多摸索,我门也都是摸索出来的
当数据量很大的时候,hibernate的效率不比jdbc慢的
natty_boy 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tondayong1981 的回复:]
我自己都晕了,上面的事hql.

应该这样

<sql-query name="PriceFilesByProduct">
<return alias="priceFile" class="com.risi.model.content.data.PriceFile"/>
SELECT * FROM price_files f,
price_files_products fp
WHERE fp.product_id = :productId
AND fp.price_file_id = f.id
</sql-query>

*你用相关的字段来代替并加上as 'name' 然后类中属性名称为nam…
[/Quote]

谢谢你的热心解答,我再试试看
我不知道你这一段配置要写在什么地方,关键是我现在的SQL里涉及到的所有表都没有对应的
hbm.xml文件,总不能随便找个 *.hbm.xml 往里写吧
Hibernate 这个东西太慢了,以前公司也不赞成用的,现在有项目要用,自己也不怎么熟悉
所以只能来这里麻烦大家了,这位哥们太热心了,再次表示我的谢意。
不介意的话交个朋友吧MSN:natty_boy@live.cn
natty_boy 2008-10-12
  • 打赏
  • 举报
回复
谢谢 tondayong1981
我不知道你用的Hibernate 是什么版本的,我的是 3.1的
用本地SQL 查询的话只能下面这样
SQLQuery query = session.createSQLQuery(sql)
但 SQLQuery 好像是没有 setResultTransformer 方法的
至于第 3 点可能和我的理解有的不一样,我试过了不行的,不过学习了。

我的意思是有比如我有两个表分别为 tabA,tabB
我在PL-SQL 中的标准 Oracle sql 为,
select tabA.aa,tabA.bb,tabB.xx,tabB.yy from tabA,tabB where tabA.id = tabB.id
现在为了把结果映射为一个对象,如我 create 了一个 class 为 ClsObj 的对象
ClsObj 具有属性 aa,bb,xx,yy 和他们的 get(),set()方法
然后把 sql 改为下面这样

String sql = select tabA.aa as {c.aa},tabA.bb as {c.bb},tabB.xx as {c.xx},tabB.yy as {c.yy} from tabA,tabB where tabA.id = tabB.id
然后用Hibernate 的本地SQL 查询方式(没有任何的 ClsObj.hbm.xml配置文件)
SQLQuery query = session.createSQLQuery(sql)
query.addEntity("c",ClsObj.class);
List list = query.list();

目的是把结果集直接映射为包含 ClsObj 对象的 List 集合,不过遗憾的是报错


tongdayong1981 2008-10-12
  • 打赏
  • 举报
回复
public class UserProduct
{
private Integer userId;

private Integer productId;

//constructor
//set get method
}
tongdayong1981 2008-10-12
  • 打赏
  • 举报
回复
错了,应该是
public class UserProduct
{
private Integer userId;

private Integer productId;

//constructor
//set get method
}
tongdayong1981 2008-10-12
  • 打赏
  • 举报
回复
UserProduct是自己创建的一个临时的对象,这个不需要hibernate配置文件的
tongdayong1981 2008-10-12
  • 打赏
  • 举报
回复
我理解你的意思,setResultTransformer可以的,不需要hbm,前提是你不需要从你获得的结果再次查询.不然要是使用view,hibernate也支持的

我的第三点的意思是将查询的数据封装成自己的对象

比如,User (id,name) Product(productId,productName,userId)
假设是many-to=one

select new UserProduct(user.id,user.product.id) From User user,Product product

public class UserProduct
{
private Integer id;

private Product product;

//constructor
//set get method
}

natty_boy 2008-10-12
  • 打赏
  • 举报
回复
自己试了下估计是不行的,写了 xx.hbm.xml 文件后是可以直接转换的
因为我的结果是一个报表统计结果,要写 xx.hbm.xml 文件我也不怎么会
为了避免错误还是拿 Object 数组自己处理吧,本来还想偷懒的
不关怎么说谢谢各位了。
natty_boy 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tondayong1981 的回复:]
1.返回的结果是Object数组,可以直接取,

2.可以createQuery("select c as c, c.name as name from Customer c").setResultTransformer(Transformers.aliasToBean(YourClass.class));

3.楼主可以创建相关的compositor类,比如CityItem,然后使用select new CityItem(city.id, city.name, city.electrityCompany.name)
from City city
[/Quote]

谢谢你给的思路,不过好像没办法解决我的问题
第 3 点不太明白什么意思
我的意思是,我的 SQL 是本地SQL ,就是直接可以在PL-SQL里运行的,
现在就是想把这种面向关系数据库的查询结果转换为一个对象,
以前用 Ibatis 来做,感觉很爽,现在用 Hibernate ,不知到能不能直接把结果映射为一个普通的 JavaBean
(前提是不用去写什么 xx.hbm.xml)
tongdayong1981 2008-10-12
  • 打赏
  • 举报
回复
1.返回的结果是Object数组,可以直接取,

2.可以createQuery("select c as c, c.name as name from Customer c").setResultTransformer(Transformers.aliasToBean(YourClass.class));

3.楼主可以创建相关的compositor类,比如CityItem,然后使用select new CityItem(city.id, city.name, city.electrityCompany.name)
from City city
natty_boy 2008-10-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liaoyi_ipanel 的回复:]
引用 1 楼 natty_boy 的回复:
我的SQL是多个表联合查询统计的报表,入过要配置hbm.xml文件的话要怎么配,因为没有和它对应的表

没有和他对应的表你为何要用sql去查询它?
[/Quote]

大哥不用SQL 我怎么查啊,我的意思是查询结果是多个表的联合查询结果
这个结果是多个表里取的不同的字段,就是这个结果没有对应的表
liaoyi_ipanel 2008-10-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 natty_boy 的回复:]
我的SQL是多个表联合查询统计的报表,入过要配置hbm.xml文件的话要怎么配,因为没有和它对应的表
[/Quote]
没有和他对应的表你为何要用sql去查询它?
liaoyi_ipanel 2008-10-09
  • 打赏
  • 举报
回复
hibernate使用sql语句要配置hbm.xml 文件
并且sql语句from cats其中cats必须是java POJO类名.(Cats)
natty_boy 2008-10-09
  • 打赏
  • 举报
回复
我的SQL是多个表联合查询统计的报表,入过要配置hbm.xml文件的话要怎么配,因为没有和它对应的表

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧