SQL Server2008表名中含“.”号处理方法

  在做简单的报表呈现的时候遇到数据库的表名是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]").

问题得解。

时间: 2024-10-25 15:54:19

SQL Server2008表名中含“.”号处理方法的相关文章

Mybatis中如何在SQL语句表名中使用参数

insert into prefix_${table_name} (a, b, c) values (#{a}, #{b}, #{c}) ${} 表示直接使用字面量(literal value) #{} 表示这个是个参数 如果 table_name 是 "ABC" 则 ${table_name} 是 ABC #{table_name} 是 "ABC" Mybatis中如何在SQL语句表名中使用参数,布布扣,bubuko.com

SQL实现表名更改,列名更改,约束更改

SQL实现表名更改,列名更改,约束更改 (转) 修改表名 格式:sp_rename tablename,newtablename sp_rename tablename,newtablename 修改字段名 格式:sp_rename 'tablename.colname',newcolname,'column' sp_rename 'tablename.colname',newcolname,'column' 添加字段 格式:alter table table_name add new_colu

sql数据库表名做参数

declare @tablename nvarchar(50)declare @count intset @tablename = 'SplitzRank'declare @sqlstr nvarchar(512)set @sqlstr = 'select @count=count(*) from '[email protected]select @sqlstrexec sp_executesql @sqlstr,N'@count int output',@count outputselect

64位 SQL Server2008链接访问Oracle 过程汇总解决方法记录

64位 SQL Server2008链接访问Oracle 过程汇总解决方法记录 经过几天不停的网上找资料,实验,终于联通了. 环境:系统:win 2008 ,SqlServer2008 R2, 连接Oracle10g 在SqlServer2008 R2机器上需要安装Oracle客户端32位和64位两个,然后配置连接别名.设置注册表.详细情况见下面 1.错误1 ------------------------------------------------ 64位机器上建立OLE_DB链接报错 报

打印文件名、函数名和行号的方法

java打印文件名.函数名和行号的方法:Log.d(TAG, new Exception().getStackTrace()[0].getMethodName()); //函数名 Log.d(TAG, Thread.currentThread().getStackTrace()[2].getMethodName()); //函数名 Log.d(TAG, ""+Thread.currentThread().getStackTrace()[2].getLineNumber()); //行号

django.db.utils.OperationalError: (1050, "Table '表名' already exists)解决方法

django.db.utils.OperationalError: (1050, "Table '表名' already exists)解决方法 找到解决方案,执行: [python] view plain copy python manage.py migrate myapp --fake 数据库表结构同步成功. django.db.utils.OperationalError: (1050, "Table '表名' already exists)解决方法 原文地址:https://

SQL Server表名为什么要加方括号?

我刚安装了Microsoft SQL Server 2000个人版,发现它的SQL语句怎么和标准不一样.比如我使用最简单的查询语句"select * from user"查询表user,结果它提示语法错误,后来系统自动给我纠正过来变成"select * from [user]",查询才成功执行了.也就是说要给表名添加方括号才是正确的格式. 这个不是必须要加,但表名或字段名如果引用了sqlserver中的关键字,数据库会不识别这到底是关键字还是表名(或字段名)时就必须

让EFCore更疯狂些的扩展类库(二):查询缓存、分部sql、表名替换的策略配置

前言 上一篇介绍了扩展类库的功能简介,通过json文件配置sql语句 和 sql语句的直接执行,这篇开始说明sql配置的策略模块:策略管理器与各种策略的配置. 类库源码:github:https://github.com/skigs/EFCoreExtend 引用类库:nuget:https://www.nuget.org/packages/EFCoreExtend/ PM> Install-Package EFCoreExtend 策略管理器功能简介 用于管理策略 与 策略执行器和调用(目前分

SQL 查找表名 字段名

转载:http://www.accessoft.com/article-show.asp?id=6135 经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjects Where name like '%user%' 如果知道列名,想查找包含有该列的表名,可加上系统表syscolumns来实现,如想查找列名中包含有user的所有表名,可通过以下SQL语句