解決方法がわからない珍しい問題があります。
データベーステーブルからデータを編集するために使用される編集ページがあります。ユーザーがページを開くと、たとえば入力値が表示されます90
。以下の Java コードを使用して、入力フィールドの DB テーブルへの重複がチェックされます。ここに問題があります。ユーザーが編集ページを開いて送信ボタンをクリックすると、毎回メッセージが表示されます90 is already in use!
。元の値をバリデーターに渡し、その値を DB テーブルにチェックインする方法を見つける必要があります。おそらく、この sql クエリは正しくありません。
// Validate Datacenter ID
public void validateDatacenterID(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException
{
Long l;
String s = value.toString().trim();
if (s.length() > 18)
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" Value is too long! (18 digits max)", null));
}
try
{
l = Long.parseLong(s);
if (l > Integer.MAX_VALUE)
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" '" + l + "' is too large!", null));
}
}
catch(NumberFormatException nfe) { l = null; }
if (l != null)
{
if (ds == null) throw new SQLException("Can't get data source");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs;
int cnt = 0;
try
{
conn = ds.getConnection();
ps = conn.prepareStatement("SELECT count(1) from COMPONENTSTATS where COMPONENTSTATSID = ?");
ps.setLong(1, l);
rs = ps.executeQuery();
while(rs.next()) cnt = rs.getInt(1);
if (cnt > 0)
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" '" + l + "' is already in use!", null));
}
}
catch(SQLException x)
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" SQL error!", null));
}
finally
{
if (ps != null) ps.close();
if (conn != null) conn.close();
}
}
else
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
s.isEmpty() ? " This field cannot be empty!" : " '" + s + "' is not a number!", null));
}
}
どうすればこの問題を解決できますか。