hsqldb-2.3.4を使用して、Springアプリケーションから接続しようとしています。
次の詳細を使用してデータベースを作成しました
Type : HSQL Database Engine Standalone
Driver: org.hsqldb.jdbcDriver
URL: jdbc:hsqldb:file:mydb
UserName: SA
Password: SA
「MYDB」スキーマの下にALBUMという名前のテーブルを作成しました
春の設定ファイル:
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dbcpDataSource" />
</bean>
<bean id="dbcpDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:file:mydb" />
<property name="username" value="SA" />
<property name="password" value="SA" />
</bean>
そして、私の春のコントローラーでjdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());
をしています
そして、それは私に例外を与えます:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM MYDB.ALBUM]; nested exception is Java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: ALBUM
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:729)
org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
HsqldbのSQLエディターで同じクエリを実行すると、問題なく実行されます。これで私を助けてください。
user lacks privilege or object not found
には複数の原因がありますが、最も明白なのは、存在しないテーブルにアクセスしていることです。それほど明白ではない理由は、コードを実行すると、ファイルデータベースURLへの接続が実際にDBを作成できるからです。あなたが経験しているシナリオは、HSQL Database Managerを使用してDBをセットアップし、テーブルと行を追加したかもしれませんが、Javaコードが使用しているこの特定のインスタンスではありません。ワークスペースにmydb.log
、mydb.lck
、mydb.properties
などのファイルのコピーが複数ないことを確認したい場合があります。 Javaコードがこれらのファイルを作成した場合、場所はプログラムの実行方法によって異なります。たとえば、Netbeans内で実行されるMavenプロジェクトでは、ファイルはpom.xmlと共に保存されます。
この質問に関する他のすべての回答を試した場合、大文字と小文字の区別の問題に直面している可能性が高くなります。
HSQLDBはデフォルトで大文字と小文字を区別します。スキーマ、列、またはテーブルの名前を二重引用符で囲まない場合、デフォルトで大文字に変換されます。オブジェクトが大文字で作成されている場合は、運がいいです。小文字の場合、オブジェクト名を二重引用符で囲む必要があります。
例えば:
CREATE MEMORY TABLE "t1"("product_id" INTEGER NOT NULL)
このテーブルから選択するには、次のクエリを使用する必要があります
select "product_id" from "t1"
前の回答で述べたように、多くの原因が考えられます。その1つは、構文の非互換性のためにテーブルが作成されないことです。 特定のDBベンダー構文または特定の機能が使用される場合、HSQLDBはそれを認識しません。次に、作成コードの実行中に、この構文上の理由でテーブルが作成されていないことがわかります。たとえば、エンティティに@Column(columnDefinition = "TEXT")
アノテーションが付けられている場合、テーブルの作成は失敗します。
回避策があります HSQLDBにpgslの互換モードになるように指示します
"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_pgs=true"
およびmysqlの場合
"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_mys=true"
Oracle
"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_ora=true"
構成に応じてバリアントがあることに注意してください。Hibernateスキーマの作成を使用しないが、スクリプトでこの種の構文を使用する必要がある場合は、hibernate.connection.url=
またはspring.datasource.url=
になります。
SET DATABASE SQL SYNTAX ORA TRUE;
また、array_agg for posgresqlなどのSQLリクエストのベンダー固有の構文による問題も修正されます。
Nota bene:スキーマを作成するためにコードがモデルを解析し、ログの多くの行に隠されると、問題が非常に早く発生します。その後、unitTestedコードが混乱して不明瞭な例外でクラッシュします特権またはオブジェクトが見つからないというエラー」は、実際の問題をまったく指摘していません。そのため、必ず最初からすべてのトレースを読んで、考えられるすべての問題を修正してください
空のメモリ内データベースにテーブルを作成しようとしたときに、エラーuser lacks privilege or object not found
が発生しました。 spring.datasource.schema
を使用しましたが、問題は「CREATE TABLE」-Statement(その後に「CREATE INDEX」が続く)の後にSQLファイル内のセミコロンが欠落したことです。
私は次のスクリプトを使用してhsql dbにデータを挿入していました
INSERT INTO Greeting (text) VALUES ("Hello World");
Hello Worldオブジェクトが見つからず、HSQLデータベースユーザーに権限がない、またはオブジェクトが見つからないというエラーに関連する問題が発生していました
以下のスクリプトに変更しました
INSERT INTO Greeting (text) VALUES ('Hello World');
そして今、それはうまく機能しています。
私は同じ間違いをしていた。私の場合、弦にアパを入れるのを忘れていました。
私はString test = "inputTest";
をしていました
正しいのはString test = "'inputTest'";
です
データベースに何かを入れようとしたときにエラーが発生していました
connection.createStatement.execute("INSERT INTO tableTest values(" + test +")";
私の場合、エラーを修正するには、引用符'
を付けてください。
私の場合、TABLE_NAMEを二重引用符「TABLE_NAME」に入れておらず、Oracleスキーマプレフィックスがあったため、エラーが発生しました。
動作しない:
SELECT * FROM FOOSCHEMA.BAR_TABLE
ワーキング:
SELECT * FROM "BAR_TABLE"
insertステートメントで変数を連結するとこの問題が発生しました。これは働いた
// var1, var3, var4 are String variables
// var2 and var5 are Integer variables
result = statement.executeUpdate("INSERT INTO newTable VALUES ('"+var1+"',"+var2+",'"+var3+"','"+var4+"',"+var5 +")");
HSWLDBサーバーを実行している場合。たとえば、Java構成ファイルには次のものがあります。
hsql.jdbc.url = jdbc:hsqldb:hsql://localhost:9005/YOURDB;sql.enforce_strict_size=true;hsqldb.tx=mvcc
セットがserver.dbname.#
であることを確認してください。例えば、私のserver.propertiesファイル:
server.database.0=eventsdb
server.dbname.0=eventsdb
server.port=9005
'org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN
'がDAYS_BETWEEN
が関数としてhsqldbによって認識されないというエラーで同様の問題がありました。代わりにDATEDIFFを使用してください。
DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )
最近、同じような問題にぶつかりました。 grailsアプリケーションを実行しており、誰かがSQLスクリプトをBootStrapファイルに挿入しました(これがgrailsのエントリポイントです)。このスクリプトは実稼働環境でのみ実行されるはずでしたが、テストで実行されていたロジックが不適切であったためです。だから私が得たエラーは:
User lacks privilege or object not found:
これ以上の説明なし...
スクリプトがテスト環境で実行されていないことを確認するだけで問題が解決しましたが、それを理解するのに3時間かかりました。私はそれが非常に特定の問題であることを知っていますが、それでも誰かに数時間のコード掘りを救うことができれば素晴らしいことです。