私はPostgreSQLをデータベースとして使用し、Javaサーブレットを使用してPostgreSQLと通信しています。私のアプリケーションでは、一致する入力ファイルのデータベースからデータをフェッチする必要があります。すべてのファイルは、データベースのbytea列に保存されます。これは私のコードです:
String checkdb="select * from key where certificate = '"+c+"';";
Statement stcheck=conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet newrs=stcheck.executeQuery(checkdb);
newrs.last();
int rowcount=newrs.getRow();
if(rowcount!=0)
throw new ArithmeticException();
ここcertificate
で、はbyteaデータを含む列の名前であり、c
(アップロードされた)は形式の証明書byte[]
です。そこで、ここでは、アップロードされた証明書がデータベースにすでに存在するかどうかを確認しています。それが存在する場合、私は例外をスローしています。
ただし、問題は、同じ証明書を複数回アップロードすることではなく、2つの証明書が異なるかのように例外が機能することです。
バイト値を正しく比較していますか?これを修正するにはどうすればよいですか?
編集
証明書列を主キーとして設定してみました。ただし、それでも証明書はデータベースに挿入されます。これはどのように起こりますか?内部比較も何らかの理由で失敗します。
編集
私はファイルを取得して文字列に変換しようとしました:
InputStream input13 = retrs.getBinaryStream("certificate");
ByteArrayOutputStream output13 = new ByteArrayOutputStream();
byte buf[]=new byte[1024];
int len;
IOUtils.copy(input13, output13);
input13.close();
byte[] retvalue=output13.toByteArray();
String s1=new String(retvalue);
String s2=new String(c);
System.out.println("in--------------"+s2);
System.out.println("out----------------"+s1);
retrsは、保存されたばかりの証明書を含む結果セットです。cはbyte[]の入力証明書です。私が得る出力は次のとおりです。
19:05:43,156 INFO [STDOUT] in-------------------BEGIN CERTIFICATE-----
MIICIjCCAYsCAQMwDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCYXMxCzAJBgNV
BAgMAmFzMQswCQYDVQQHDAJhczELMAkGA1UECgwCYXMxCzAJBgNVBAsMAmFzMQsw
CQYDVQQDDAJjYTERMA8GCSqGSIb3DQEJARYCYXMwHhcNMTIwNDEwMDY0ODQ3WhcN
MTMwNDEwMDY0ODQ3WjBSMQswCQYDVQQGEwJhczELMAkGA1UECBMCYXMxCzAJBgNV
BAcTAmFzMQswCQYDVQQKEwJhczELMAkGA1UECxMCYXMxDzANBgNVBAMTBmNsaWVu
dDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsfJq9TVgTLqz84nuWpDm+dvI
do2HIWoHkmEPNowK4xn1+qWUPCy30aASWI92YMtE6njtQGyZBYij0iTAxldDktqd
bMdpKAONDlSv71rn+fZPuyenbBFYZexybNVsRMFzTD/F/hiPPXT7E1j9CrgIMxVz
ScZeNATh/dPLwuNQ0dsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQDDUyeIWlKaMMkM
8VRGuDJyKFC8miQfmul6zE4+6RTswHKjcUoje2vhTQgV+GBfqx8ai+ziujx8CeyR
eJWcb1G8gg+LMUNDcTOlXTeBG9L2c/gMOEu7BEjtpojSYmFyEvJEQ5Yep44HKZZb
FSPFVNxGiXBhNxtKQdAu6/smQ/eBNg==
-----END CERTIFICATE-----
19:05:43,156 INFO [STDOUT] out----------------[B@17f8b39
間違った検索方法です。[B@17f8b39
記憶の場所かそのようなもののように見えるからです。
回答
@jarnbjoが言ったように1つのことを覚えておく必要があります。postgressqlでバイト配列を使用する場合は常に、.Elseのみretieving or inserting
を使用するかどうかに関係setBytes()
なく、byte []のメモリ位置(Javaのハッシュコード)のみが挿入されます。