在做简单的报表呈现的时候遇到数据库的表名是XX.XXX这种命名形式(数据库用的是SQL Server2008,"."是合法的字符,持久层框架是hibernate),如果用@Entity注释,在取数据的时候就会抛出sql异常:对象名无效,原因是hibernate将"."号后面的作为了表名进行hql语句的拼接。由于数据库是设计好不能更改表名的了,所以只好尝试各种方法。
首先我百度了很久,没找到有出现这种情况的(大概是很少有人这样设计表名),于是我尝试使用转义、单引号、双引号、括号等各种能想到的靠谱甚至不靠谱的方法,一一失败。
后来在师兄的提点下,先在navicat里用sql语句查询,看是否能取出数据。发现如果表名加了双引号或单引号是可以取到数据的,但是对我的问题还是没能解决。
于是师兄又建议我直接用原生的sql来查询,不使用hibernate的hql语句:select * from XX.XXX,然后创建SQLquery对象来执行,结果显示能取到数据,但这样拿到的数据我还需要再手动进行包装,将object对象转成我要的类对象,着实麻烦。于是我又回到百度……
这一次终于让我浪里淘沙找到有用的信息,即用 "FROM [数据库名].[dbo].[表名]"这种形式来查询,当我在Java类里面直接执行这一语句的时候还是报了错,后来一分析,hql是根据对象来查询的,他是先找到Java类对象,再根据类对象所映射的表名拼接到hql语句来执行查询的,所以我将实体类的注释改为@Table(name="[数据库名].[dbo].[XX.XXX]").
问题得解。