[DAO-39] UnlessNullで更新したときにPK以外が全てnullだとSQLRuntimeExceptionが発生する。 Created: 2006-11-02  Updated: 2006-11-02  Resolved: 2006-11-02

Status: Resolved
Project: S2Dao
Component/s: s2dao
Affects Version/s: None
Fix Version/s: 1.0.38

Type: Bug Priority: Minor
Reporter: azusa Assignee: taichi
Resolution: Fixed Votes: 0
Labels: None


 Description   

そんな使い方する方が悪いのかもしれませんが。

以下、スタックトレースです。

org.seasar.framework.exception.SQLRuntimeException: [ESSR0071]SQLで例外(ErrorCode=-28, SQLState=S0022)が発生しました。理由はorg.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[UPDATE EMP SET ,deptno = ? WHERE empno = ?], ErrorCode=

{1}, SQLState={2})が発生しました
at org.seasar.extension.jdbc.util.ConnectionUtil.prepareStatement(ConnectionUtil.java:52)
at org.seasar.extension.jdbc.impl.BasicStatementFactory.createPreparedStatement(BasicStatementFactory.java:34)
at org.seasar.extension.jdbc.impl.BasicHandler.prepareStatement(BasicHandler.java:95)
at org.seasar.extension.jdbc.impl.BasicUpdateHandler.execute(BasicUpdateHandler.java:73)
at org.seasar.extension.jdbc.impl.BasicUpdateHandler.execute(BasicUpdateHandler.java:66)
at org.seasar.dao.impl.UpdateDynamicCommand.execute(UpdateDynamicCommand.java:40)
at org.seasar.dao.impl.UpdateAutoDynamicCommandTest.testExecute2Tx(UpdateAutoDynamicCommandTest.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at junit.framework.TestCase.runTest(TestCase.java:154)
at org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:233)
at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:89)
at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:150)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[UPDATE EMP SET ,deptno = ? WHERE empno = ?], ErrorCode={1}

, SQLState=

{2}

)が発生しました
at org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.wrapException(ConnectionWrapperImpl.java:524)
at org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.prepareStatement(ConnectionWrapperImpl.java:144)
at org.seasar.extension.jdbc.util.ConnectionUtil.prepareStatement(ConnectionUtil.java:50)
... 24 more
Caused by: java.sql.SQLException: Column not found: , in statement [UPDATE EMP SET ,deptno = ? WHERE empno = ?]
at org.hsqldb.jdbc.jdbcUtil.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.prepareStatement(ConnectionWrapperImpl.java:141)
... 25 more



 Comments   
Comment by taichi [ 2006-11-02 ]

修正をコミットしました。

Comment by azusa [ 2006-11-02 ]

deptNoをIntegerにしてやってみました。
org.seasar.framework.exception.SQLRuntimeException: [ESSR0071]SQLで例外(ErrorCode=-28, SQLState=S0022)が発生しました。理由はorg.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[UPDATE EMP SET WHERE empno = ?], ErrorCode=

{1}, SQLState={2})が発生しました
at org.seasar.extension.jdbc.util.ConnectionUtil.prepareStatement(ConnectionUtil.java:52)
at org.seasar.extension.jdbc.impl.BasicStatementFactory.createPreparedStatement(BasicStatementFactory.java:34)
at org.seasar.extension.jdbc.impl.BasicHandler.prepareStatement(BasicHandler.java:95)
at org.seasar.extension.jdbc.impl.BasicUpdateHandler.execute(BasicUpdateHandler.java:73)
at org.seasar.extension.jdbc.impl.BasicUpdateHandler.execute(BasicUpdateHandler.java:66)
at org.seasar.dao.impl.UpdateDynamicCommand.execute(UpdateDynamicCommand.java:40)
at org.seasar.dao.impl.UpdateAutoDynamicCommandTest.testExecute2Tx(UpdateAutoDynamicCommandTest.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at junit.framework.TestCase.runTest(TestCase.java:154)
at org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:233)
at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:89)
at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:150)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[UPDATE EMP SET WHERE empno = ?], ErrorCode={1}

, SQLState=

{2}

)が発生しました
at org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.wrapException(ConnectionWrapperImpl.java:524)
at org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.prepareStatement(ConnectionWrapperImpl.java:144)
at org.seasar.extension.jdbc.util.ConnectionUtil.prepareStatement(ConnectionUtil.java:50)
... 24 more
Caused by: java.sql.SQLException: Column not found: WHERE in statement [UPDATE EMP SET WHERE empno = ?]
at org.hsqldb.jdbc.jdbcUtil.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at org.seasar.extension.dbcp.impl.ConnectionWrapperImpl.prepareStatement(ConnectionWrapperImpl.java:141)
... 25 more

Comment by taichi [ 2006-11-02 ]

このテストケースだと、deptnoがintである為、実際には全てnullになっていません。実質的にバグってますので、修正します。

Comment by azusa [ 2006-11-02 ]

再現テストケースです。(1.0.xのbranchで作成してます)

Index: C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/UpdateAutoDynamicCommandTest.java
===================================================================
— C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/UpdateAutoDynamicCommandTest.java (revision 596)
+++ C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/UpdateAutoDynamicCommandTest.java (working copy)
@@ -57,4 +57,19 @@
assertEquals(before.getMgr(), after.getMgr());
}

+ public void testExecute2Tx() throws Exception {
+ DaoMetaData dmd = createDaoMetaData(EmployeeAutoDao2.class);
+ SqlCommand select = dmd.getSqlCommand("getEmployee2");
+
+ Employee11 e = new Employee11();
+ e.setEmpno(7369);
+ SqlCommand unlessNull = dmd.getSqlCommand("update2UnlessNull");
+ assertTrue(unlessNull instanceof UpdateAutoDynamicCommand);
+ unlessNull.execute(new Object[]

{ e }

);
+
+ Employee11 after = (Employee11) select.execute(new Object[]

{ new Integer( + 7369) }

);
+ assertNotNull(after);
+ }
+
}
Index: C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/Employee11.java
===================================================================
— C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/Employee11.java (revision 0)
+++ C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/Employee11.java (revision 0)
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2004-2006 the Seasar Foundation and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.seasar.dao.impl;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+public class Employee11 implements Serializable {
+
+ public static final String TABLE = "EMP";
+
+ public static final String timestamp_COLUMN = "tstamp";
+
+ private long empno;
+
+ private String ename;
+
+ private String job;
+
+ private Short mgr;
+
+ private java.util.Date hiredate;
+
+ private Float sal;
+
+ private Float comm;
+
+ private int deptno;
+
+ private String dummy;
+
+ public Employee11()

{ + }

+
+ public Employee11(long empno)

{ + this.empno = empno; + }
+
+ public long getEmpno() { + return this.empno; + }
+
+ public void setEmpno(long empno) {+ this.empno = empno;+ }

+
+ public java.lang.String getEname()

{ + return this.ename; + }

+
+ public void setEname(java.lang.String ename)

{ + this.ename = ename; + }

+
+ public java.lang.String getJob()

{ + return this.job; + }

+
+ public void setJob(java.lang.String job)

{ + this.job = job; + }

+
+ public Short getMgr()

{ + return this.mgr; + }

+
+ public void setMgr(Short mgr)

{ + this.mgr = mgr; + }

+
+ public java.util.Date getHiredate()

{ + return this.hiredate; + }

+
+ public void setHiredate(java.util.Date hiredate)

{ + this.hiredate = hiredate; + }

+
+ public Float getSal()

{ + return this.sal; + }

+
+ public void setSal(Float sal)

{ + this.sal = sal; + }

+
+ public Float getComm()

{ + return this.comm; + }

+
+ public void setComm(Float comm)

{ + this.comm = comm; + }

+
+ public int getDeptno()

{ + return this.deptno; + }

+
+ public void setDeptno(int deptno)

{ + this.deptno = deptno; + }

+
+ public String getDummy()

{ + return this.dummy; + }

+
+ public void setDummy(String dummy)

{ + this.dummy = dummy; + }

+
+ public boolean equals(Object other)

{ + if (!(other instanceof Employee11)) + return false; + Employee11 castOther = (Employee11) other; + return this.getEmpno() == castOther.getEmpno(); + }

+
+ public int hashCode()

{ + return (int) this.getEmpno(); + }

+
+ public String toString()

{ + StringBuffer buf = new StringBuffer(); + buf.append(empno).append(", "); + buf.append(ename).append(", "); + buf.append(job).append(", "); + buf.append(mgr).append(", "); + buf.append(hiredate).append(", "); + buf.append(sal).append(", "); + buf.append(comm).append(", "); + buf.append(deptno).append(", "); + return buf.toString(); + }

+}
Index: C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/EmployeeAutoDao2.java
===================================================================
— C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/EmployeeAutoDao2.java (revision 0)
+++ C:/Tomcat/webapps/s2dao-1.0.x/s2-dao/src/test/java/org/seasar/dao/impl/EmployeeAutoDao2.java (revision 0)
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2004-2006 the Seasar Foundation and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.seasar.dao.impl;
+
+import java.util.List;
+
+public interface EmployeeAutoDao2

{ + + public Class BEAN = Employee11.class; + + public String getEmployee2_ARGS = "empno"; + + public Employee11 getEmployee2(int empno); + + public void update2UnlessNull(Employee11 employee); + +}
Generated at Tue Apr 15 21:48:41 JST 2025 using Jira 10.5.0#10050000-sha1:9d9d098bb7b67e8dba8da380ba9c3900d82ac3cf.