0

ここに私の問題があります:

私は3つのテーブルを持っています:

  • ROLE: RID ,NAME
  • CLIENT: お客様 ID、名前
  • USER: UID、RID、CID、ユーザー名、パスワード

以下は、私が書いたSQLステートメントです。

SELECT USER.UID,USERNAME,PASSWORD,ROLE.NAME, ROLE.RID 
FROM USER 
INNER JOIN ROLE ON USER.RID=ROLE.RID 
WHERE CID=1;

上記のステートメントは、実際には 2 行あるはずなのに、1 行しか返していません。

何が機能していないのかわかりません。

次の操作を行うと、2 つの行が取得されます。 SELECT * FROM USER WHERE CID =1;

私は春のフレームワークを使用していて、RowMapperも実装していることに注意してください。以下は、dbase に従ってフィールド名を使用した実際のコードです。

public List<User> viewUserClient(int client_id) {
    String sql =
            "SELECT USER.ID,USERNAME,PASSWORD,ACTIVE,ROLE.NAME, ROLE.ID FROM USER INNER JOIN ROLE ON USER.ROLE_ID=ROLE.ID WHERE CLIENT_ID=?";
    List<User> users = this.getJdbcTemplate().query(sql, new Object[] { client_id }, new UserClientRowMapper());
    return users;
}

private static final class UserClientRowMapper implements RowMapper<User> {
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        Client client = new Client();
        Role role = new Role();

        user.setID(rs.getInt("ID"));
        user.setUSERNAME(rs.getString("USERNAME"));
        user.setPASSWORD(rs.getString("PASSWORD"));
        user.setACTIVE(rs.getBoolean("ACTIVE"));

        role.setNAME(rs.getString("NAME"));
        role.setID(rs.getInt("ROLE.ID"));

        client.setId(rs.getInt("id"));
        client.setName(rs.getString("name"));

        user.setRole(role);
        user.setClient(client);
        return user;
    }

}

よろしくお願いします。

4

1 に答える 1

0

INNER JOIN キーワードは、両方のテーブルに少なくとも 1 つの一致がある場合に行を返します。「ROLE」に一致しない行が「USER」にある場合、それらの行はリストされません。単純な選択クエリによって返された 2 人のユーザーのうち、おそらく 1 人は RID 列の値が null であるか、ROLE テーブルにない値を持っています。

LEFT JOIN を使用します。

于 2012-11-11T14:25:14.577 に答える