[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 メーリングリストの案内