1

java-hibernate-mysqlの組み合わせを使用しています

更新クエリを実行すると、次のエラーが発生します。Hibernateの何が問題なのかわかりません。次の私は私が得ているエラーを投稿しました:

org.hibernate.QueryException: Not all named parameters have been set: [0] [update       sequence s set s.cmd_output='neox     tty1         2012-06-08 09:40 (:0)
neox     pts/1        2012-06-08 09:41 (:0)
neox     pts/0        2012-06-08 09:41 (:0)
neox     pts/2        2012-06-08 09:41 (:0)
neox     pts/3        2012-06-08 12:48 (deval-PC.local.lan)
[neox@localhost ~]$ ', s.cmd_output_time='2012-06-08 12:48:58' where s.id=43]
at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:106)
at org.hibernate.impl.QueryImpl.executeUpate(QueryImpl.java:85)
at db_model.sequence_db.insert_Sequence_new(sequence_db.java:242)
at views.CaptureNavigationView$10.widgetSelected(CaptureNavigationView.java:555)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at nspl.test.ui.Application.start(Application.java:43)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLaunch    er.java:110)
at     org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

なぜこのエラーが発生するのか誰か教えてもらえますか?

4

4 に答える 4

3

文字を含むSQL文字列を実行し:ていますか?もしそうなら、Hibernateはパラメーターを期待しており、あなたはそれを設定していません。

String sql = "update SomeTable set someColumn = :value";

これを使用すると、通常、を使用して値パラメータを設定します

SQLQuery query = getSession().createSQLQuery(sql);
query.setString("value", "Some value with : in it");

または類似。:私はあなたの値がパラメータを意味しないその中にあると仮定することができるだけなので、これを文字列として構築し、それをパラメータとして設定する必要があります。

于 2012-06-08T07:35:41.337 に答える
1

問題はここで太字の部分にあります:2012-06-08 09:41(:0

文字列を連結してクエリを作成するのではなく、パラメータを使用する必要があります。これは、hqlクエリで:文字をエスケープする唯一の方法です。

例 :

String param1 = "neox     tty1         2012-06-08 09:40 (:0)\n" +
                "neox     pts/1        2012-06-08 09:41 (:0)\n"+
                "neox     pts/0        2012-06-08 09:41 (:0)\n" +
                "neox     pts/2        2012-06-08 09:41 (:0)\n" +
                "neox     pts/3        2012-06-08 12:48 (deval-PC.local.lan)\n" +
                "[neox@localhost ~]$ ";
String param2 = "2012-06-08 12:48:58";
String id = 43;

String hqlQuery = "update sequence s set s.cmd_output = :cmd_output, " +
                  "s.cmd_output_time = :cmd_output_time where s.id = :cmdId";

getHibernateTemplate().findByNamedParam(hqlQuery, 
   new String[] {"cmd_output", "cmd_output_time", "cmdId"},
   new Object[] {param1, param2, id});
于 2012-06-08T07:42:44.487 に答える
0

要約すると

1.すべての名前付きパラメーターを設定する必要があります。2。値を名前付きパラメーターに動的に設定する場合は、:を含めないでください。次の場合:文字列連結を使用し、namedparamのアプローチを削除する必要があります。最初の答えで言ったように。

于 2012-06-08T07:48:45.997 に答える
0

動的な場合は、puttongif条件によって名前付きパラメータークエリをバイパスできます。

したがって、クエリ文字列として作成し、条件を設定して名前付きパラメータを追加します。

名前付きパラメーターアプローチを削除する必要はありません。

于 2012-10-11T06:40:25.623 に答える