`
wxzauh
  • 浏览: 18489 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SQL"column ambiguously defined"异常

阅读更多
使用hibernate的nativeSQL写了一个查询语句,但是后台报了SQL语法错误,具体报错如下:

[java] 2012-08-08 12:55:00] ERROR  -> ORA-00918: column ambiguously defined 
[2012-08-08 12:55:00] ERROR  -> org.hibernate.exception.SQLGrammarException: could not execute query 

[2012-08-08 12:55:00] ERROR  -> ORA-00918: column ambiguously defined
[2012-08-08 12:55:00] ERROR  -> org.hibernate.exception.SQLGrammarException: could not execute query
原因一:

如果2张表包含相同的字段,则对着同一个字段的操作如果不加上表名就会报此异常,如:

Student表:

id name
1 student1
2 student2


CREATE TABLE `Student` (
`id` int(11) NOT NULL,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
)


Teacher表:

id name studentid
1 teacher 1

CREATE TABLE `Teacher` (
`id` int(11) NOT NULL,
`name` char(20) NOT NULL,
`studentid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `FK_STUDENTID` FOREIGN KEY (`studentid`) REFERENCES `student` (`id`)
)
则使用如下的sql查询就会报上面的异常:

select name from Teacher t LEFT OUTER JOIN Student s on t.studentid = s.id
sql语句本身就是有问题的,事实上数据库不知道sql中的name到底是Student表中的name字段还是Teacher表中的name字段



原因二:

还有一种情况也会出现该问题

select t.name,t.name,t.name
     from Teacher t LEFT OUTER JOIN Student s on t.studentid = s.id
sql语句本身是没有问题的,不会在数据库客户端或诸如PL/SQL之类的工具中报错并且能正常查询出结果

但是hibernate的查询却会报上面的错误,那么问题应该出在hibernate方言或者是jdbc驱动上

解决方法是给重复的数据加上别名:

select t.name as name1,t.name as name2,t.name as name3   
     from Teacher t LEFT OUTER JOIN Student s on t.studentid = s.id 
分享到:
评论

相关推荐

    ORACLE疑难错误解析.pdf

    4. **列定义重复 (column ambiguously defined)** 在进行表连接时,如果引用的字段在多个表中都存在,不指定表名会导致这个错误。比如,EMP和DEPT两个表都有DEPT_NO字段,直接使用`dept_no`进行查询会出现重复定义...

    SQL21日自学通

    Column Ambiguously Defined 478 Not Enough Arguments for Function480 Not Enough Values481 Integrity Constraint Violated--Parent Key Not Found 482 Oracle Not Available 483 Inserted Value Too Large for ...

    Cracking the PM Interview

    Cracking the PM InterviewHow many pizzas are delivered in Manhattan?... Learn how the ambiguously-named 'PM' (product manager / program manager) role varies across companies, what exp

    【精品】副词练习题二(解析.doc

    - "ambiguously"(含糊不清地):指说话或表达模糊不清。 - "aggressively"(攻击地):表示积极进取或有攻击性的行为。 5. 成功与努力的关系: 副词"mean"在此表示"意味着"。句子指出,成功意味着努力工作,但...

    单词关于IT

    13. **Ambiguously**:在编程或文档中,含糊不清的描述可能导致误解。编写清晰、明确的代码和文档是避免混淆的重要原则。 14. **Permission Denied**:这是一个常见的错误消息,表明用户没有足够的权限执行特定操作...

Global site tag (gtag.js) - Google Analytics