[Seasar-user:958] S2Dao:N:1でカラム名が違うとき

jazzatny jazzatny
2004年 8月 26日 (木) 06:27:48 JST


佐藤です。
「SQLファイルのSQL:1.0.3ではOK,1.0.4ではNG」であげた件
ですが、発生する条件がわかりました。自動生成でも発生します。

N:1の処理で、N側と1側でカラム名が違うとき、生成されるSQLは
間違いなく実行されますが、その後1側の値をセットする際に、
org.seasar.extension.jdbc.ValueType
      #getValue(ResultSet resultSet, String columnName)で
例外が発生します。

例えば次のようなSQLが生成されたとします。

SELECT EMP2.empno,
        EMP2.ename,
        EMP2.deptnum,
        department2.deptno AS deptno_0,
        department2.dname AS dname_0
   FROM EMP2 LEFT OUTER JOIN DEPT department2 ON
        EMP2.DEPTNUM = department2.DEPTNO

deptnoがShortだとすると、ShortType#getValue()内で
 ShortConversionUtil.toShort(resultSet.getObject(columnName));
が呼び出されるところで、coulmnNameに"deptno"が渡されたところで
「Column not found」のSQLExceptionが発生します。
Debuggerで試すと"deptno_0"が渡されれば値を取得できます。

何か勘違いしていますか?よろしくお願いします。

例:

CREATE TABLE EMP2
        (EMPNO NUMERIC(4) NOT NULL PRIMARY KEY,
         ENAME VARCHAR(10),
         DEPTNUM NUMERIC(2));

INSERT INTO EMP2 VALUES (7369, 'SMITH', 20);
INSERT INTO EMP2 VALUES (7499, 'ALLEN', 30);

CREATE TABLE DEPT2
        (DEPTNO NUMERIC(2) NOT NULL PRIMARY KEY,
         DNAME VARCHAR(14));

INSERT INTO DEPT VALUES (20, 'RESEARCH');
INSERT INTO DEPT VALUES (30, 'SALES');
COMMIT;

-----以下setter等省略-------------------

public class Employee2 implements Serializable {
     public static final String TABLE = "EMP2";
     public static final int department2_RELNO = 0;
     public static final String department2_RELKEYS = "DEPTNUM:DEPTNO";

     private long empno;
     private String ename;
     private Short deptnum;

     private Department2 department2;
}

---------------------------------------

public class Department2 implements Serializable {
	
     public static final String TABLE = "DEPT";

     private Short deptno;
     private String dname;
}

--------------------------------------

public interface Employee2Dao {

	public Class BEAN = Employee2.class;
	
	public List getAllEmployees();
}

--------------------------------------

public class Employee2DaoClient {

	private static final String PATH = "examples/dao/Employee2ao.dicon";

	public static void main(String[] args) {
		S2Container container = S2ContainerFactory.create(PATH);
		container.init();
		try {
			Employee2Dao dao = (Employee2Dao) container
					.getComponent(Employee2Dao.class);
			List employees = dao.getAllEmployees();
			for (int i = 0; i < employees.size(); ++i) {
				System.out.println(employees.get(i));
			}
		} finally {
			container.destroy();
		}
	}
}



Seasar-user メーリングリストの案内