Hi,
ich hoffe das ist der richtige Bereich dafür.
Ich versuche mich gerade daran Java mit einer Datenbank zu verbinden. Als Datenbank habe ich HSQLDB in der Version 2.0.0 genommen. Ich habe mein Programm auch schon mit HSQL verbunden und kann auch schon Select-Anweisungen durchführen, allerdings habe ich bei einer Select-Anweisung ein Problem und ich weiß nicht warum und wie ich es lösen kann.
Wenn ich
"SELECT Mann, Benutzername, Passwort, Gewicht, Erstellzeit From (Nutzer INNER JOIN Programmressourcen ON Nutzer.ID = Programmressourcen.ID);"
Benutze funktioniert das Problemlos, möchte ich allerdings ein
"WHERE Nutzer.ID = 0;"
hinten anhängen, bekomme ich auf einmal eine SQL-Exception geworfen:
user lacks privilege or object not found: NUTZER.ID
obwohl er diese Spalte für den JOIN ja auch findet...:coolgrim: Den gleichen Fehler bekommt er auch wenn ich
"SELECT Nutzer.ID, Mann, Benutzername, Passwort, Gewicht, Erstellzeit From (Nutzer INNER JOIN Programmressourcen ON Nutzer.ID = Programmressourcen.ID);"
schreibe, aber nicht bei
"SELECT Nutzer.ID, Mann, Benutzername, Passwort, Gewicht FROM Nutzer;"
Ich hoffe ich hab mein Problem einigermaßen verständlich dargelegt:engel:
Ach ja, ich benutze eine Standalone HSQLDB falls es etwas nützt...
Problem mit HSQLDB
-
-
ich mach nie was mit der HSQL, aber rein vom SQL her:
"SELECT Mann, Benutzername, Passwort, Gewicht, Erstellzeit From (Nutzer INNERJOIN Programmressourcen ON Nutzer.ID = Programmressourcen.ID);"wenn du das where außerhalb der Klammer machst geht's nicht, da dort Nutzer nicht bekannt ist. Du joinst in der Klammer Nutzer und Programmresourcen zusammen (=> subquery) und machst dann auf diese Subquery eine Abfrage.
Entweder:
- sparst du dir die Klammer
- musst du die Where-Clause in der Klammer machen
- oder der Subquery einen Namen geben
"SELECT Mann, Benutzername, Passwort, Gewicht, Erstellzeit From (Nutzer INNERJOIN Programmressourcen ON Nutzer.ID = Programmressourcen.ID) sub where sub.ID=123" -
wenn du das where außerhalb der Klammer machst geht's nicht, da dort Nutzer nicht bekannt ist. Du joinst in der Klammer Nutzer und Programmresourcen zusammen (=> subquery) und machst dann auf diese Subquery eine Abfrage.
Die Klammern erzeugen meines Wissens doch keine Subquery, die dienen doch nur dazu, vorzugeben, in welcher Reihenfolge die Tabellen gejoined werden sollen. Ist hier überflüssig, weil es bei zwei Tabellen ohnehin nur eine Reihenfolge gibt, in der die Tabellen gejoined werden können.
Hab jetzt kurz mit HSQL rumgespielt. Vielleicht hilft "INNER JOIN" statt "INNERJOIN"?
-
sry, fehler beim Kopieren, im Quelltext hab ich natürlich "INNER JOIN". Und wenn ich die gleiche Abfrage bei MYSQL eingebe funktioniert sie dort auch, warum also nicht bei HSQL obwohl doch die Version 2.0.0 SQL-92 unterstützt... Bin halt im Moment etwas ratlos, hab es im Moment so gelöst, das ich die Tabellen nicht verknüpfe, sondern einfach zwei SQL-Anfragen sende, eine zu der Tabelle Nutzer und eine zu der Tabelle Programmressourcen:
"SELECT Mann, Benutzername, Passwort, Gewicht FROM Nutzer
WHERE ID = 0"
"SELECT Erstellzeit FROM Programmressourcen WHERE ID = 0"
Und dann besorge ich mir meine Daten halt aus beiden ResultSet´s, ist aber jetzt nicht die beste Lösung und wüsste halt schon gerne was ich falsch mache. Braucht ihr noch Informationen, z.B. die Create-Anweisungen oder sonst irgendetwas oder könnt ihr euch auch keinen Reim darauf machen? -
Habs mal mit der aktuellen HSQL (2.0.1) ausprobiert, zwei Tabellen jeweils mit Spalten ID (integer) + name und konnte hier das Problem nicht nachvollziehen (Statements jeweils über den HSQL-Database-Manager ausgeführt):
geht alles:
select * from role inner join user on role.id=user.id
select * from (role inner join user on role.id=user.id)
select * from role inner join user on role.id=user.id where role.id=1
select * from (role inner join user on role.id=user.id) where role.id=1Von wo rufst du deine Statements auf, vielleicht hats da irgendwas?
-
poste doch mal die genaue fehlermeldung, die du bekommst (stack trace wenn du's in java machst), dann lässt sich vielleicht mehr sagen.
-
Ich spreche die Datenbank in Java über den jdbcDriver an. Folgender Code läuft auch ohne Probleme:
Code[size=10]ResultSet resultSet = [/SIZE][B][size=10][COLOR=#7f0055][size=10][COLOR=#7f0055]this[/COLOR][/SIZE][/COLOR][/SIZE][/B][size=10].[/SIZE][size=10][COLOR=#0000c0][size=10][COLOR=#0000c0]verbindung[/COLOR][/SIZE][/COLOR][/SIZE][size=10].executeQuery[/SIZE] [size=10]([/SIZE][size=10][COLOR=#2a00ff][size=10][COLOR=#2a00ff]"SELECT Mann, Benutzername, Passwort, Gewicht, "[/COLOR][/SIZE][/COLOR][/SIZE][size=10] +[/SIZE] [align=left][size=10][COLOR=#2a00ff][size=10][COLOR=#2a00ff]"Erstellzeit From (Nutzer INNER JOIN Programmressourcen "[/COLOR][/SIZE][/COLOR][/SIZE][size=10] +[/SIZE] [size=10][COLOR=#2a00ff][size=10][COLOR=#2a00ff]"ON Nutzer.ID = Programmressourcen.ID)"[/COLOR][/SIZE][/COLOR][/SIZE][size=10]);[/SIZE][/align]
Wenn ich aber eine Bedingung anhänge bekomme ich eine Exception geworfen. Die lokale Variable ID,. die angehängt wird, ist dabei die ID die gesucht ist.
Code[align=left][size=10][size=10]ResultSet resultSet2 = [/SIZE][/SIZE][size=10][B][size=10][COLOR=#7f0055][size=10][COLOR=#7f0055]this[/COLOR][/SIZE][/COLOR][/SIZE][/B][size=10].[/SIZE][size=10][COLOR=#0000c0][size=10][COLOR=#0000c0]verbindung[/COLOR][/SIZE][/COLOR][/SIZE][size=10].executeQuery[/SIZE][/SIZE][size=10] [size=10]([/SIZE][size=10][COLOR=#2a00ff][size=10][COLOR=#2a00ff]"SELECT Mann, Benutzername, Passwort, Gewicht, "[/COLOR][/SIZE][/COLOR][/SIZE][size=10] +[/SIZE] [size=10][COLOR=#2a00ff][size=10][COLOR=#2a00ff]"Erstellzeit From (Nutzer INNER JOIN Programmressourcen "[/COLOR][/SIZE][/COLOR][/SIZE][size=10] +[/SIZE] [size=10][COLOR=#2a00ff][size=10][COLOR=#2a00ff]"ON Nutzer.ID = Programmressourcen.ID) WHERE Nutzer.ID = "[/COLOR][/SIZE][/COLOR][/SIZE][size=10] + ID);[/SIZE][/align] [/SIZE]
Lasse ich den Code mit resultSet2 durchlaufen bekomme ich folgende Exception:
Code[align=left][U][size=10][COLOR=#000080][size=10][COLOR=#000080]java.sql.SQLException[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]: user lacks privilege or object not found: NUTZER.ID[/COLOR][/SIZE][/COLOR][/SIZE] [size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at org.hsqldb.jdbc.Util.sqlException(Unknown Source)[/COLOR][/SIZE][size=10][COLOR=#ff0000]at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)[/COLOR][/SIZE][align=left][size=10][COLOR=#ff0000]at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)[/COLOR][/SIZE][size=10][COLOR=#ff0000]at cocktail_2_0.datenbank.Datenbankverbindung.executeQuery([/COLOR][/SIZE][/COLOR][/SIZE][U][size=10][COLOR=#000080][size=10][COLOR=#000080]Datenbankverbindung.java:50[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000])[/COLOR][/SIZE][/COLOR][/SIZE] [/align][align=left][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at cocktail_2_0.datenbank.Datenbank.getNutzer([/COLOR][/SIZE][/COLOR][/SIZE][U][size=10][COLOR=#000080][size=10][COLOR=#000080]Datenbank.java:593[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000])[/COLOR][/SIZE][/COLOR][/SIZE][/align][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at cocktail_2_0.system.CocktailSystem.loadCocktailprogramm([/COLOR][/SIZE][/COLOR][/SIZE][U][size=10][COLOR=#000080][size=10][COLOR=#000080]CocktailSystem.java:36[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000])[/COLOR][/SIZE][/COLOR][/SIZE][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at cocktail_2_0.system.CocktailSystem.<init>([/COLOR][/SIZE][/COLOR][/SIZE][U][size=10][COLOR=#000080][size=10][COLOR=#000080]CocktailSystem.java:31[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000])[/COLOR][/SIZE][/COLOR][/SIZE][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at cocktail_2_0.gui.Hauptbildschirm.cocktailSystemErzeugen([/COLOR][/SIZE][/COLOR][/SIZE][U][size=10][COLOR=#000080][size=10][COLOR=#000080]Hauptbildschirm.java:190[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000])[/COLOR][/SIZE][/COLOR][/SIZE][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at cocktail_2_0.gui.Hauptbildschirm.<init>([/COLOR][/SIZE][/COLOR][/SIZE][U][size=10][COLOR=#000080][size=10][COLOR=#000080]Hauptbildschirm.java:47[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000])[/COLOR][/SIZE][/COLOR][/SIZE][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at cocktail_2_0.gui.Hauptbildschirm.main([/COLOR][/SIZE][/COLOR][/SIZE][U][size=10][COLOR=#000080][size=10][COLOR=#000080]Hauptbildschirm.java:43[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000])[/COLOR][/SIZE][/COLOR][/SIZE][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]Caused by: [/COLOR][/SIZE][/COLOR][/SIZE][align=left][U][size=10][COLOR=#000080][size=10][COLOR=#000080]org.hsqldb.HsqlException[/COLOR][/SIZE][/COLOR][/SIZE][/U][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]: user lacks privilege or object not found: NUTZER.ID[/COLOR][/SIZE][/COLOR][/SIZE][/align][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]at org.hsqldb.error.Error.error(Unknown Source)[/COLOR][/SIZE][align=left][size=10][COLOR=#ff0000]at org.hsqldb.ExpressionColumn.checkColumnsResolved(Unknown Source)[/COLOR][/SIZE][align=left][size=10][COLOR=#ff0000]at org.hsqldb.QueryExpression.resolve(Unknown Source)[/COLOR][/SIZE][size=10][COLOR=#ff0000]at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)[/COLOR][/SIZE][size=10][COLOR=#ff0000]at org.hsqldb.ParserCommand.compilePart(Unknown Source)[/COLOR][/SIZE][size=10][COLOR=#ff0000]at org.hsqldb.ParserCommand.compileStatements(Unknown Source)[/COLOR][/SIZE][size=10][COLOR=#ff0000]at org.hsqldb.Session.executeDirectStatement(Unknown Source)[/COLOR][/SIZE][size=10][COLOR=#ff0000]at org.hsqldb.Session.execute(Unknown Source)[/COLOR][/SIZE][/align][/align][/COLOR][/SIZE][size=10][COLOR=#ff0000][size=10][COLOR=#ff0000]... 9 more[/COLOR][/SIZE][/COLOR][/SIZE]
[/SIZE]
[/align] -
weg mit den klammern im sql-statement!
interessanterweise geben hsql 1.8 und 2.0 unterschiedliche fehlermeldungen in diesem fall:
1.8.0: java.sql.SQLException: Unexpected token T1, requires SELECT in statement [select * from (t1]
2.0.0: java.sql.SQLException: user lacks privilege or object not found: ID -
Ok, jetzt funtzt es:D
THX
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!