我的SQL是多个表联合查询统计的报表,入过要配置hbm.xml文件的话要怎么配,因为没有和它对应的表

解决方案 »

  1.   

    hibernate使用sql语句要配置hbm.xml 文件
    并且sql语句from cats其中cats必须是java POJO类名.(Cats)
      

  2.   

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

  3.   


    大哥不用SQL 我怎么查啊,我的意思是查询结果是多个表的联合查询结果
    这个结果是多个表里取的不同的字段,就是这个结果没有对应的表
      

  4.   

    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
      

  5.   


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

  6.   

    自己试了下估计是不行的,写了 xx.hbm.xml 文件后是可以直接转换的
    因为我的结果是一个报表统计结果,要写 xx.hbm.xml 文件我也不怎么会
    为了避免错误还是拿 Object 数组自己处理吧,本来还想偷懒的
    不关怎么说谢谢各位了。
      

  7.   

    我理解你的意思,setResultTransformer可以的,不需要hbm,前提是你不需要从你获得的结果再次查询.不然要是使用view,hibernate也支持的我的第三点的意思是将查询的数据封装成自己的对象比如,User (id,name) Product(productId,productName,userId)
    假设是many-to=oneselect new UserProduct(user.id,user.product.id) From User user,Product productpublic class UserProduct
    {
       private Integer id;   private Product product;
     
       //constructor
       //set get method
    }
      

  8.   

    UserProduct是自己创建的一个临时的对象,这个不需要hibernate配置文件的
      

  9.   

    错了,应该是
    public class UserProduct 

      private Integer userId;   private Integer productId;   //constructor 
      //set get method 

      

  10.   

    public class UserProduct 

      private Integer userId;   private Integer productId;   //constructor 
      //set get method 
      

  11.   

     谢谢 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 集合,不过遗憾的是报错
      

  12.   

     上面应该是不行的,应该用上面我说的第三种方法
     
    select new clsObj(tabA.aa ,tabA.bb,tabB.xx,tabB.yy  )from tabA,tabB where tabA.id = tabB.id 
      

  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你往这个方向再试试,关键长时间不用都有点忘了
      

  14.   


    谢谢你的热心解答,我再试试看
    我不知道你这一段配置要写在什么地方,关键是我现在的SQL里涉及到的所有表都没有对应的
    hbm.xml文件,总不能随便找个 *.hbm.xml 往里写吧
    Hibernate 这个东西太慢了,以前公司也不赞成用的,现在有项目要用,自己也不怎么熟悉
    所以只能来这里麻烦大家了,这位哥们太热心了,再次表示我的谢意。
    不介意的话交个朋友吧,MSN:[email protected]
      

  15.   

    因为我现在项目缠身,所以没空帮你写例子,你配置在hbm.xml中,一般会放在相关的业务的hbm中,比如PriceFile.hbm.xml中当然按理来说是可以随便放在那个hbm中,因为load的时候是一起加载到内存的,当然一般不会这样,会被老大k死的多摸索,我门也都是摸索出来的
    当数据量很大的时候,hibernate的效率不比jdbc慢的
      

  16.   

    好像hibernate 只能 查询对象吧,不能查询字段。  不能用 sql 要用 hql 。。另外还要配置 Cat.hbm.xml 文件 和表对应。
      

  17.   

    // 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]; 
    // }
    各位帮忙看看,一对数组怎么在页面上接收呢