Java 如何在Hibernate的原生SQL中编写连接查询?

Java 如何在Hibernate的原生SQL中编写连接查询?,java,hibernate,native-sql,Java,Hibernate,Native Sql,我遇到了这个例外,有人能帮我吗 实际上,我的疑问是我使用的是两个pojo类,但我的Transformers.aliasToBean只是一个类,在我的输出jsp页面中打印这两个类实际上需要多少时间 提前谢谢 `我认为您对参数感到困惑。当您想在查询中传递一些值时,可以调用setParameter() org.hibernate.QueryParameterException: could not locate named parameter [hotelid] 查询中不需要任何值,因此根本不需要调

我遇到了这个例外,有人能帮我吗

实际上,我的疑问是我使用的是两个pojo类,但我的Transformers.aliasToBean只是一个类,在我的输出jsp页面中打印这两个类实际上需要多少时间

提前谢谢


`

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

org.hibernate.QueryParameterException: could not locate named parameter [hotelid]
查询中不需要任何值,因此根本不需要调用setParamert。试试这个

SQLQuery q=session.createSQLQuery("select d.name from hotel.hoteldetails1 d where d.hotelid=:hotelidd");
q.setParameter("hotelid", 1);
SQLQuery q=session.createSQLQuery(“从hoteldetails1中选择d.name、d.country、f.monday、f.周二,然后在d.hotelid=f.hotelid上加入hotelfacilities1 f”);
q、 setResultTransformer(Transformers.aliasToBean(HotelFacilities.class));
List l=q.List();
编辑


删除
来自查询。

您正在使用
setParameter
方法将值放入命名参数中,但您不会将任何命名参数放入查询字符串中。您可以使用“:”语法来执行此操作

org.hibernate.QueryParameterException: could not locate named parameter [hotelid]
我不知道你的查询是什么,所以我不知道你是否真的想要命名参数。从结果转换器中猜测,我认为您需要一个
HotelFacilities
对象的列表

另外,您使用了一些非常笨拙的语法,我将在本例中替换这些语法

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();
此查询返回星期一属性和星期二属性与命名参数匹配的所有HotelFacilities,以及匹配的HotelDetails与提供的名称和国家/地区属性匹配的所有HotelFacilities。您不必加入HotelID,因为(我猜)在您的映射中已经处理了HotelID

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

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

//我们在jdbc中编写连接查询的方式与hibernate相同

q.setString("name", detailsName);
q.setString("country", detailsCountry);
q.setString("monday", facilitiesMonday);
q.setString("tuesday", facilitiesTuesday);
//本地级别
ArrayList数据=新的ArrayList();
地图请求;
//方法级
SQLQuery q=session.createSQLQuery(“选择h.roomid作为roomid,选择h.phone1作为phone1,选择h.phone2作为phone2,选择r.type作为type,选择r.nrooms作为hoteldetails1中的nrooms,其中h.roomid=r.roomid”);
System.out.println(“查询后”);
//q、 setParameter(0,roomid);
q、 addScalar(“roomid”,StandardBasicTypes.INTEGER);
q、 addScalar(“phone1”,StandardBasicTypes.STRING);
q、 addScalar(“phone2”,StandardBasicTypes.STRING);
q、 addScalar(“类型”,StandardBasicTypes.STRING);
q、 addScalar(“nrooms”,StandardBasicTypes.STRING);
List l=q.List();
System.out.println(“b4代表回路”);
对于(对象[]对象:l){
添加数据(obj);
请求。输入(“l”,数据);
}
返回“成功”;
/*
在jsp页面中,下面给出了如何检索输出
*/
//在jsp页面中,代码如下
室友
电话1
电话2
类型
房间

您对查询结果的期望是什么?我希望在jsp页面上打印一个表中的姓名、国家/地区和一个表中的星期一、星期二为这两个表提供定义。请尝试我的更新答案。这不是setParameter,而是addScalar plz help Mec。您能提供表定义吗?你能给我一个加入查询的程序吗?例如,确保hoteldetails1和hotelfacilities1有hotelid字段。即使它不起作用,如果你不挖掘,你能给我一个加入查询的程序吗我的意思是,就像答案中的那个?还有什么不起作用?
//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); 

    %>