当我尝试在hibernate中使用命名查询显示表的一些内容时,我收到错误。我试过寻找答案,没有成功。代码如下所示。
<sql-query name="ActiveCustomers">
<return alias="cts" class="Customer"/>
SELECT
cts.cid AS {cts.cid},
cts.cname AS {cts.cname},
cts.email AS {cts.email},
cts.status {cts.status}
FROM Customers cts
WHERE cts.status=:st
</sql-query>
从客户端我调用它,如下所示:
SessionFactory sf=CHibernateUtil.getSessionFactory();
Session session=sf.openSession();
tx=session.beginTransaction();
list=session.getNamedQuery("ActiveCustomers").setString("st","Active").list();
for(Customer c:list){
System.out.println(c);
}
tx.commit();
session.close();
但是我收到了这个错误:
休眠:
SELECT
cts.cid AS cid0_,
cts.cname AS cname0_0_,
cts.email AS email0_0_,
cts.status status0_0_
FROM Customers cts
WHERE cts.status=?
org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.ErrorCodeConverter.handledNonSpecificException(ErrorCodeConverter.java:92)
.
.
Caused by: java.sql.SQLException: Column 'city0_0_' not found.
但是,如果我添加表的所有列,那么它的工作原理。但这不是我的要求。我的要求是只显示cid,cname,电子邮件和状态。
答案 0 :(得分:1)
终于明白了。
当我们使用以下语法时,我们需要指定整个类变量,返回类型也是对象类型或类类型。
<sql-query name="ActiveCustomers">
<return alias="cts" class="Customer"/>
SELECT
cts.cid AS {cts.cid},
cts.cname AS {cts.cname},
cts.email AS {cts.email},
cts.status {cts.status}
FROM Customers cts
WHERE cts.status=:st
</sql-query>
另一方面,当我们想要选择少数或特定列时,我们需要使用一个名为
的不同标签<return scalar ...
这里的返回类型是对象数组,我们需要从该对象数组中打印出值。现在,为了满足我们的要求,可以按如下方式重写上述查询:
另请注意select语句的语法差异。
<sql-query name="ActiveCustomers">
<return-scalar column="cid" type="string"/>
<return-scalar column="cname" type="string"/>
<return-scalar column="email" type="string"/>
<return-scalar column="status" type="string"/>
SELECT
cts.cid AS cid,
cts.cname AS cname,
cts.email AS email,
cts.status status
FROM Customers cts
WHERE cts.status=:st
</sql-query>
客户端的变化是我们阅读数据的方式..
for(Object obj[]:aclist){
for(Object o:obj){
System.out.println(o);
}
}
答案 1 :(得分:0)
可能在下面你缺少AS(cts.status AS {cts.status})
&lt; sql-query name =&#34; ActiveCustomers&#34;&gt;
&lt; return alias =&#34; cts&#34;类=&#34;顾客&#34; /&GT;
选择
cts.cid AS {cts.cid},
cts.cname AS {cts.cname},
cts.email AS {cts.email},
cts.status {cts.status}
来自客户cts
WHERE cts.status =:st
&LT; / SQL查询&GT;