Hibernate中的native sql 连接sqlserver服务器的应用

用HQL连接数据库非常方便,可是有些左右连接则是非常麻烦,据说需要设置一对多、多对多等关系,而且是在.xml中设置,如果真是这样,修改表结构等,则非常麻烦,很可能导致忘掉某些内容,因此,我不推荐这种方式,所以,我现在选择了native sql方式,这种方式可以用数据库服务器的本地sql语言,十分的方便,一个项目确定之后,很难去更改数据库(通用项目除外)类型,而且,这种方法还可利用数据库本身带的一些函数。

实践中我却遇到了不小的麻烦,在这里写出来,以免类我这样的初学者少走弯路。

用HQL语句读取数据正常,但用如下sql语句在native sql上,则总出现错误

"select * from authors",返回的错误,can't excute query或是can't connection等字样。

经过多天的查找资料,该资料非常少,终于搞定,原来是sql语句有问题。

"select * from pubs.dbo.authors"才是正确的,为什么,原因是HQL语句中的实体类有默认的数据库名称,HQL生成sql时,已经加上,而该直接执行的则不知道读哪个数据库了,所以不会执行。

以下示例可以让初学者了解如何使用其中的一种方法。

示例:

BWzxxDAO bwd = new BWzxxDAO();
  Session s = bwd.getSession();
  try {
   List list = s
     .createSQLQuery(
       "select a.wzdm as wzdm,a.wzmc as wzmc,isnull(b.ybmc,b.ybwh) as ybwh from sh.dbo.b_wzxx as a join tm_yzsh_lyc.dbo.b_ybxx as b on a.wzdm = b.wzdm")
     .addScalar("wzmc", Hibernate.STRING).addScalar("wzdm",
       Hibernate.STRING).addScalar("ybwh",Hibernate.STRING).list();
   for (int i = 0; i < list.size(); i++) {
    Object[] o = null;
    o = (Object[]) list.get(i);
    System.out.println(o[0].toString() + " " + o[1] + "  "+o[2]);
   }
 
   } catch (HibernateException e) {
   System.out.println(e.toString());
  } finally {
   s.close();
  }

你可能感兴趣的:(Hibernate中的native sql 连接sqlserver服务器的应用)