【问题标题】:How to write join query in native SQL of Hibernate?如何在 Hibernate 的原生 SQL 中编写连接查询?
【发布时间】:2014-07-20 08:18:14
【问题描述】:
List<AddHotelBean> list=new ArrayList<AddHotelBean>();
List<HotelFacilities> list1=new ArrayList<HotelFacilities>();
public String execute(){

    Configuration cfg=new Configuration();
    cfg.configure();
    SessionFactory sf=cfg.buildSessionFactory();
    Session session=    sf.openSession();

    SQLQuery q=session.createSQLQuery("select d.name,d.country,f.monday,f.tuesday from hotel.hoteldetails1 d , hotel.hotelfacilities1 f where d.hotelid=f.hotelid;");


    q.addScalar("name", StandardBasicTypes.STRING);
    q.addScalar("country", StandardBasicTypes.STRING);
    q.addScalar("monday", StandardBasicTypes.STRING);
    q.addScalar("tuesday", StandardBasicTypes.STRING);

    q.setResultTransformer(Transformers.aliasToBean(HotelFacilities.class));

    List<HotelFacilities> l=q.list();

    for(HotelFacilities a:l) {
        a.getMonday();
        a.getTuesday();
        list1.add(a);
    }
org.hibernate.QueryParameterException: could not locate named parameter [hotelid]

我遇到了这个异常,请任何人帮助我

实际上我怀疑我正在使用两个 pojo 类,但我的 Transformers.aliasToBean 只是一个类,它实际上需要两个类的东西才能在我的输出 jsp 页面中打印

提前致谢。

`

【问题讨论】:

  • 您对查询结果的期望是什么?
  • 我想要一张桌子上的姓名、国家和星期一、星期二从一张桌子上打印到我的 jsp 页面上
  • 为这两个表提供定义。
  • 试试我更新的答案。

标签: java hibernate native-sql


【解决方案1】:

您正在使用setParameter 方法将值放入命名参数中,但您没有将任何命名参数放入查询字符串中。您可以使用“:”语法来做到这一点。

我不知道你的查询是什么,所以我不知道你是否真的想要命名参数。根据您的结果转换器猜测,我认为您想要一个 HotelFacilities 对象列表。

另外,你使用了一些非常尴尬的语法,我将在这个例子中替换它。

from HotelFacilities f
join HotelDetails d
where d.name = :name
  and d.country = :country
  and f.monday = :monday
  and f.tuesday = :tuesday

此查询返回星期一属性和星期二属性与命名参数匹配的所有 HotelFacilities,并且匹配的 HotelDetails 与提供的名称和国家/地区属性匹配。您不必加入 HotelID,因为(我想)这已经在您的映射中处理了。

要在您的 java 代码中设置这些命名参数,请使用正确的类型化方法,在本例中为 setString

q.setString("name", detailsName);
q.setString("country", detailsCountry);
q.setString("monday", facilitiesMonday);
q.setString("tuesday", facilitiesTuesday);

【讨论】:

  • 即使它不工作,如果你不是我的,你能给我任何连接查询示例的程序吗
  • 你的意思是,就像答案中的那个?什么不起作用?
【解决方案2】:

我认为您对参数感到困惑。当你想在查询中传递一些值时,你调用setParameter()

SQLQuery q=session.createSQLQuery("select d.name from hotel.hoteldetails1 d where d.hotelid=:hotelidd");
q.setParameter("hotelid", 1);

您在查询中不需要任何值,因此您根本不需要调用 setParamert。试试这个

SQLQuery q=session.createSQLQuery("SELECT d.name, d.country, f.monday, f.tuesday FROM hoteldetails1 d JOIN hotelfacilities1 f ON d.hotelid=f.hotelid");
q.setResultTransformer(Transformers.aliasToBean(HotelFacilities.class));
List<HotelFacilities> l=q.list();

编辑

从查询中删除;

【讨论】:

  • 对不起,它不是 setParameter 它是 addScalar 请帮助我
  • 能否提供表格定义?以及您尝试使用查询获得的结果。
  • 即使它没有来
  • 即使它不工作,如果你不是我的,你能给我任何连接查询示例的程序吗
  • 确保hoteldetails1 和hotelfacilities1 有hotelid 字段。
【解决方案3】:

//我们在jdbc中写join查询和hibernate是一样的

//local level
ArrayList<Object[]> data = new ArrayList<Object[]>();
Map request;


//method level
SQLQuery q=session.createSQLQuery("select  h.roomid as roomid, h.phone1 as     phone1,h.phone2 as phone2,r.type as type,r.nrooms as nrooms from hoteldetails1 h,roomdetails1 r where h.roomid=r.roomid ");

    System.out.println("after query");
    //q.setParameter(0,roomid);


    q.addScalar("roomid",StandardBasicTypes.INTEGER);
    q.addScalar("phone1",StandardBasicTypes.STRING);
    q.addScalar("phone2",StandardBasicTypes.STRING);
    q.addScalar("type",StandardBasicTypes.STRING);
    q.addScalar("nrooms",StandardBasicTypes.STRING);

    List<Object[]> l=q.list();

    System.out.println("b4 for loop");
    for(Object[] obj:l){



        data.add(obj);
        request.put("l",data);

    }

  return "success";


 /*
 in the jsp page how to retrive the output is given below
*/

//in jsp page code is like this
<%


List<Object[]> l =(List) request.getAttribute("l");



%>

 <table border=1>
 <tr>
 <th>roomid</th>
 <th>phone1</th>
 <th>phone2</th>
 <th>type</th>
 <th>rooms</th>

 </tr>  
 <%
  for(Object[] obj:l){


  int i=(Integer)obj[0];
  String j=(String)obj[1];
  String k=(String)obj[2];
  String r=(String)obj[3];
  String m=(String)obj[4];
  out.println(obj[0] +"   "+i);
  out.println(obj[1] +"   "+j);
  out.println(obj[2] +"   "+k);
  out.println(obj[3] +"   "+r);
  out.println(obj[4] +"   "+m); 

    %>

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 2017-11-10
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2011-08-28
    • 2021-03-20
    相关资源
    最近更新 更多