ORA-00918: “de la Colonne de manière ambiguë défini”
Je'va été à essayer de comprendre pourquoi Oracle est de relever cette erreur pendant des jours, mais n'a pas pu trouver une solution qui m'a aidé dans tous les sujets que j'ai lu. Je suis en espérant que quelqu'un pourrait m'aider.
Je suis en train de travailler sur cette requête :
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;
Cela fonctionne parfaitement bien sur SQL Developer, mais soulève cette erreur lorsque vous exécutez en 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)
Causés par cette ligne sur mon programme (où querySelect est le SQLQuery objet):
List<T> list = (List<T>) querySelect.addEntity(referenceClass).list();
J'ai besoin de garder c.NOM.d.NOM et t.NOM dans le SÉLECTIONNER en raison de l'ORDRE et je ne sais pas comment faire cela sans élever cette erreur... j'ai essayé des alias dans le SELECT, mais ne fonctionne pas non plus.
EDIT:
Semble être un problème Hibernate , plus qu'un SQL.
Ici est la fonction de collecte de l'erreur, sur la "addEntity" de ligne. Dans ce cas, il est prévu pour renvoyer une liste de Concentrateur de l'objet.
@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;
}
Voici le Concentrateur de champs d'objet :
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;
c.ID
) dans le order by
clause.dans le
order by
donner le nom de la table im,id,lien,iwDans votre clause order by, il y a un certain nombre de qualifiés colonnes (im, id, lien, iw). L'une de ces noms de colonne sur plus d'une seule des tables jointes? Un coup d'œil, id semble probable.
Montrez votre Java morceau de code,ce code n'est pas adapté pour le cadrage de la réponse!
OriginalL'auteur Flash_Back | 2014-06-23
Vous devez vous connecter pour publier un commentaire.
Cela ressemble à une veille prolongée chose, plutôt que strictement un problème SQL.
Je pense que
addEntity
exige que toutes les colonnes ont des noms distincts, qui correspondent aux champs de l'entité en cours d'ajout. Oracle, hélas, n'a pas de problème de retour des résultats avec double problème des noms, c'est pourquoi votre requête dans SQL Developer.Essayer de donner à tous vos colonnes dans la clause SELECT distinct des alias, plus précisément, les alias qui correspondent le terrain, les membres de votre entité.
Je pense que oui, vous pouvez le faire, mais n'oubliez pas d'utiliser la deuxième forme de
addEntity
:addEntity("department", Department.class)
. Vous pouvez consulter cette autre question pour plus d'idées.OriginalL'auteur João Mendes
J'ai enfin trouvé la solution grâce à vous tous !
J'ai accepté João Mendes répondre parce que j'ai effectivement résolu le problème avec alias correct, mais toutes les autres réponses sont également pertinentes et m'a aidé.
Voici la requête finale.
Dans le
DISTINCT
j'ai mis tout l'objet associé (Concentrateur) les champs, et les deux utilisés dans leORDER BY
à l'utilisation correcte des alias.Pas la plus jolie, je suppose, mais a bien fonctionné !
Vous avez raison, je vais changer ça donc je ne vais pas avoir de telles questions. Merci beaucoup pour votre aide Polppan ! 😉
Vous êtes les bienvenus.
OriginalL'auteur Flash_Back
Je pense que cela peut fonctionner pour vous..
Utiliser des noms pleinement qualifiés pour toutes les colonnes de la
order by
clause.avez-vous essayé d'exécuter la requête directement dans sql*plus ou dans le serveur de base de données
Oui, la requête que j'ai écrit sur le premier post de travaille et produit le résultat attendu dans SQL Developer. Cependant, certains de cartographie problème semble se produire lorsque vous exécutez en Java. L'erreur est déclenchée par le "addEntity" de la fonction.
OriginalL'auteur ashok_p
Essayez d'utiliser la requête suivante, vous avez trois
name
colonnes et j'ai renommé il afname
,sname
ettname
. Renommer ceux la ils vous le souhaitez, avec des noms uniques.Notez également que vous avez utilisé certains des mots réservés, afin de tenter d'avoir des noms d'alias pour ceux aussi bien, je l'ai renommé. Il est toujours préférable d'éviter d'utiliser réservés des mots clés dans la création d'objets de base de données afin d'éviter les erreurs.
Pourriez-vous poster votre Java extrait de code qui permet de définir les entités?
Êtes-vous en utilisant les mêmes noms d'alias dans la clause order by?
J'ai édité mon premier post, en espérant que cette fonction était ce que l'on demandait. Oui je lui ai donné un essai avec votre demande exacte, de sorte que devrait être la même, les noms d'alias. Cependant, je pense que la veille prolongée erreur est due au fait que je suis cartographie de certains Concentrateur d'objet, mais il y a aussi un Département de champ (d.nom) et un champ de type a (t.nom) dans le SELECT. Je suppose que je dois spécifier que d'.nom et t.nom ne font pas partie de la Concentrateur d'objet en quelque sorte
Dans votre Département de la classe d'entité, le nom de la map colonne avec quelques autres noms comme
dName
de sorte qu'il sera différent des autres nom de la colonne. En plus de ne Hibernate générer des instructions SQL avant de l'exception est levée?OriginalL'auteur Jåcob
Veille prolongée est susceptible d'emballage SQL au sein d'une autre requête à utiliser Oracle rownum le filtrage dans l'maxresults et firstrows. Cela signifie que tous les doublons (c.Nom et d.NOM) va entraîner des exceptions, sauf si un alias comme décrit ici: Colonne de manière ambiguë défini dans la sous-requête à l'aide de rownums .
Autres JPA fournisseurs (EclipseLink par exemple) sera automatiquement des alias de champs lors de l'utilisation de la pagination, de sorte que vous pourriez vouloir vérifier si un plus tard, Hibernate version fait la même chose ou de tirer le correctif décrit ici https://hibernate.atlassian.net/browse/HHH-951 un Autre double bug qui décrit le problème est https://hibernate.atlassian.net/browse/HHH-1436
OriginalL'auteur Chris