2014-10-28 4 views
0

다음 Java Entity 클래스 기반 데이터 수집으로 PostgreSQL INSERT INTO SQL 스크립트를 채우는 방법은 무엇입니까? 문제는 SQL 스크립트에서 바이트 배열의 내용을 INSERT INTO 값 ('바이트 내용'의 내용)으로 쓰는 방법입니다.바이트 배열을 INSERT INTO SQL 스크립트 (Java + PostgreSQL)에 덤프하는 방법

즉, Java 응용 프로그램을 통해이 데이터를 공급할 수 없다는 요구에 따라 프로덕션 환경에서 기존 데이터베이스를 채우기위한 일부 SQL 스크립트가 필요합니다. 감사. 행 SQL 스크립트의

Entity 클래스

@Entity 
@Table(name="image_table") 
public class ImageData implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Integer id; 

    @Column(name = "content") 
    private byte[] content; 
} 

형식 그대로 귀하의 질문에 대답하기 위해

INSERT INTO image_table (id, content) VALUES ('1', '<content of the byte[]>'); 
INSERT INTO image_table (id, content) VALUES ('2', '<content of the byte[]>'); 
+0

content.toCharArray 또는 이와 비슷한 내용일까요? – Ashalynd

+0

JPA 및 setParameter를 사용하십시오. –

답변

2

를 생성해야 : 당신은 SQL을 작성할 수 있습니다 INSERT 스크립트를 정수과 blob 값이지만 바이트에 대한 16 진수 이스케이프 문자열에서는 다소 끔찍한 것이므로 큰 blo에 대한 긴 명령문으로 인해 쉽게 문제가 발생할 수 있습니다 bs; PostgreSQL 자체에는 실질적인 제한이 없지만 대부분의 일반 텍스트 편집기가 있습니다.

PostgreSQL 9.0부터 hex 형식 (설명서 here)을 사용할 수 있습니다. 기본적으로 텍스트 표현의 16 진수 값은 E'\x3FB5419C' 등으로 표시됩니다. 따라서 E'\x 메서드에서 출력 한 다음 byte[]을 16 진수 문자열로 입력 한 다음 '을 닫습니다. byte[] content의 16 진수 문자열을 쓰려면 org.apache.commons.codec.binary.Hex.encodeHexString(content)을 사용하거나 일반 Java 솔루션의 경우 this SO answer을 사용하십시오. 프로덕션 환경에 따라 백 슬래시 \\을 피하고 개행 문자로 피들링해야 할 수 있습니다. 나는 당신에게이 작품을 작은 얼룩으로 시험해보고 어떤 효과가 있는지 알아볼 것을 제안합니다.

더 나은 방법은 직접 삽입입니다. PostgreSQL JDBC 드라이버를 사용한다고 가정하면 documentation has a worked out example입니다. 당신은 귀하의 콘텐츠 칼럼의 상단에 @Lob 주석을 배치해야

PreparedStatement ps = conn.prepareStatement("INSERT INTO image_table (id, content) VALUES (?, ?)"); 
ps.setInteger(1, 1); 
ps.setBytes(2, content); 
ps.executeUpdate(); 
ps.setInteger(1, 2); 
ps.executeUpdate(); 
ps.close(); 
+0

안녕하세요 Patrick! 가치있는 피드백에 감사드립니다. 예, Blob 값을 행 SQL 스크립트에 작성하는 것은 나쁜 습관이지만 언급 한대로 요구 사항에 따라 프로덕션 환경에서 사용하기 위해 일부 행 SQL 스크립트가 필요합니다. 따라서 Blob 값을 SQL 스크립트 파일 행에 쓰려면 어떻게해야할까요? 데이터 형식은 무엇입니까? – Channa

+1

@Channa 업데이트 된 답변을 참조하십시오. – Patrick

+0

안녕하세요 Patrick! 가치있는 답변에 감사드립니다. 내가 언급 한대로 바이트 배열을 16 진수 (일반 Java 솔루션 포함)로 변환하고 해당 값을 SQL 스크립트에 다음과 같이 추가합니다. 문자열 hexVal = " '\\ x"+ bytesToHex (내용) + "'"; INSERT INTO image_table (id, content) VALUES ('1', hexVal); – Channa

1

: 당신이 byte[] 클래스 멤버를 감안할 때, 당신은 (AN InputStream 인스턴스를 기대) 대신 setBinaryStream()setBytes() 방법을 사용해야합니다. 최종 결과는 다음과 같습니다.

import javax.persistence.Lob; 
. 
. 
. 
@Lob 
@Column(name = "content") 
private byte[] content;