ORA-00918:“不明确定义的列” [英] ORA-00918: "Column ambiguously defined"

查看:124
本文介绍了ORA-00918:“不明确定义的列”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在试图理解为什么甲骨文几天来都在提出这个错误,但找不到任何解决方案帮助我阅读所有相关主题。我希望有人能帮助我。
我正在处理这个查询:

pre $ SELECT distinct c.NAME,c.SUPERVISIONNAME,c.INTERNALADDRESS, c.IM,c.ID,c.LINK,c.IW,d.NAME,t.NAME
FROMCONCENTRATORc
LEFT OUTER JOINCONCENTRATOR_GROUPUSING(CONCENTRATOR_ID)
LEFT OUTER JOIN GROUP G采用(GROUP_ID)
LEFT OUTER JOIN TYPE T使用(TYPE_ID)
LEFT OUTER JOIN 部门 d USING(DEPARTMENT_ID)
其中TRIM(UPPER( t.NAME))='type'
ORDER BY im DESC,id DESC,link DESC,iw DESC,TRIM(UPPER(d.name))ASC,TRIM(UPPER(c.name))ASC;

这在SQL Developer中工作得很好,但在Java中运行时会引发此错误:

  java.sql.SQLSyntaxErrorException:ORA-00918:列在oracle.jdbc.driver.T4CTTIoer中含糊地定义了

。 processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc .driver.T4C8Oall.doOALL(T4C8Oall.java:531)
在oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
在oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement的.java:884)在oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167

在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
在orac le.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
处oracle.jdbc.driver.OraclePreparedStatementWrapper oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
。的executeQuery(OraclePreparedStatementWrapper.java:1493)
在org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
在org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement。 java:96)
at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke (来源不明)
在org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)在org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler
。在com.sun.proxy中调用(AbstractProxyHandler.java:81)
$ Proxy39.execu (org.hibernate.loader.java:878)
(org.hibernate.loader.java:829) b在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
在org.hibernate.loader.Loader.doList(Loader.java:2463)
在org.hibernate.loader。 Loader.doList(Loader.java:2449)
在org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279)
在org.hibernate.loader.Loader.list(Loader.java: 2274)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1585)
在org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:224)
位于org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156)
位于com.francetelecom.visionet.server .persistance.dao.impl.TemplateDAOImpl.paginate(TemplateDAOImpl.java:282)
at com.francetelecom.visionet.server.persistance.dao.impl.Concen tratorDAOImpl.findByCriteriaTest(ConcentratorDAOImpl.java:545)

由我的程序中的这一行导致(其中querySelect为相关的SQLQuery对象):

  List< T> list =(List< T>)querySelect.addEntity(referenceClass).list(); 

我需要在SELECT中保留c.NAME,d.NAME和t.NAME,因为ORDER BY,我不知道如何做到这一点,而不会引发这个错误...我尝试了别名在SELECT中,但也没有工作。



编辑:



似乎是一个Hibernate问题,不仅仅是一个SQL问题。
以下是在addEntity行上引发错误的函数。在这种情况下,预计会返回一个集中器对象列表。

  @Override 
@SuppressWarnings(unchecked )
public PaginatedList< T> paginate(SQLQuery querySelect,SQLQuery queryCount,int page,int numPerPage)throws PersistanceException
{
PaginatedList< T> pList = new PaginatedList< T>();
尝试{
int offset = 0;
if(numPerPage> -1){
offset = page * numPerPage;
}
int totalAllPages =((BigDecimal)queryCount.uniqueResult())。intValue();
querySelect.setMaxResults(numPerPage);
querySelect.setFirstResult(offset);
列表< T> listAll =(List< T>)querySelect.addEntity(referenceClass).list();
pList.setItems(listAll);
pList.setPage(page);
pList.setPageSize(numPerPage);
pList.setTotal(totalAllPages);
catch(HibernateException e){
抛出新的PersistanceException(e);
}
返回pList;
}

以下是集中器的对象字段:

 私人字符串名称; 
private String supervisionName;
private String internalAddress;
private boolean activeAlarms;
private int im;
private int id;
private int iw;
私人诠释链接;
私人日期lastUpdate;
私人类型类型;
私营部门;


解决方案

这看起来像是一个Hibernate的东西, SQL问题。



我认为 addEntity 要求所有列都有不同的名称,它们与实体中的字段匹配添加。 Oracle,唉,没有问题返回重复的问题名称的结果,这就是为什么你的查询在SQL Developer中工作。



尝试给SELECT子句中的所有列使用不同的别名,具体而言,匹配实体中字段成员的别名。


I'va been trying to understand why Oracle is raising this error for days, but couldn't find any solution that helped me in all the related topics I read. I'm hoping that someone would help me. I'm working on this query :

SELECT distinct c.NAME, c.SUPERVISIONNAME, c.INTERNALADDRESS, c.IM, c.ID, c.LINK, c.IW, d.NAME, t.NAME
FROM "CONCENTRATOR" c
LEFT OUTER JOIN "CONCENTRATOR_GROUP" USING(CONCENTRATOR_ID)
LEFT OUTER JOIN "GROUP" g USING(GROUP_ID)
LEFT OUTER JOIN "TYPE" t USING(TYPE_ID)
LEFT OUTER JOIN "DEPARTMENT" d USING(DEPARTMENT_ID)
WHERE TRIM(UPPER(t.NAME)) = 'type'
ORDER BY im DESC, id DESC, link DESC, iw DESC, TRIM(UPPER(d.name)) ASC, TRIM(UPPER(c.name)) ASC;

This works perfectly fine on SQL Developer, but raises this error when run in Java:

java.sql.SQLSyntaxErrorException: ORA-00918: column ambiguously defined

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at com.sun.proxy.$Proxy39.executeQuery(Unknown Source)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1978)
at org.hibernate.loader.Loader.doQuery(Loader.java:829)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
at org.hibernate.loader.Loader.doList(Loader.java:2463)
at org.hibernate.loader.Loader.doList(Loader.java:2449)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279)
at org.hibernate.loader.Loader.list(Loader.java:2274)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1585)
at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:224)
at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156)
at com.francetelecom.visionet.server.persistance.dao.impl.TemplateDAOImpl.paginate(TemplateDAOImpl.java:282)
at com.francetelecom.visionet.server.persistance.dao.impl.ConcentratorDAOImpl.findByCriteriaTest(ConcentratorDAOImpl.java:545)

Caused by this line on my program (where querySelect is the related SQLQuery object):

List<T> list = (List<T>) querySelect.addEntity(referenceClass).list();

I need to keep c.NAME, d.NAME and t.NAME in the SELECT due to the ORDER BY and I don't know how to do this without raising this error... I tried aliased in the SELECT but didn't work either.

EDIT:

Seems to be an Hibernate issue , more than an SQL one. Here is the function raising the error, on the "addEntity" line. In that case, it is expected to return a list of Concentrator's object.

@Override
@SuppressWarnings("unchecked")
public PaginatedList<T> paginate(SQLQuery querySelect, SQLQuery queryCount, int page, int numPerPage) throws PersistanceException
{
    PaginatedList<T> pList = new PaginatedList<T>();
    try {
        int offset = 0;
        if (numPerPage > -1) {
            offset = page * numPerPage;
        }
        int totalAllPages = ((BigDecimal) queryCount.uniqueResult()).intValue();
        querySelect.setMaxResults(numPerPage);
        querySelect.setFirstResult(offset);
        List<T> listAll = (List<T>) querySelect.addEntity(referenceClass).list();
        pList.setItems(listAll);
        pList.setPage(page);
        pList.setPageSize(numPerPage);
        pList.setTotal(totalAllPages);
    } catch (HibernateException e) {
        throw new PersistanceException(e);
    }
    return pList;
}

Here are the Concentrator's object fields :

private String name;
private String supervisionName;
private String internalAddress;
private boolean activeAlarms;
private int im;
private int id;
private int iw;
private int link;
private Date lastUpdate;
private Type type;
private Department department;

解决方案

This looks like a Hibernate thing, rather than strictly a SQL problem.

I think addEntity requires all columns to have distinct names, that match the fields in the entity being added. Oracle, alas, has no problem returning results with duplicate problem names, which is why your query works in SQL Developer.

Try giving all your columns in the SELECT clause distinct aliases, specifically, aliases that match the field members in your entity.

这篇关于ORA-00918:“不明确定义的列”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆