2013-07-24 39 views
23

Tôi đã xem và không thể tìm thấy câu trả lời cho thử thách sau đây mà tôi đang gặp phải. Nó có vẻ khá đơn giản nhưng tôi đã không thể giải quyết nó.Cách sử dụng danh sách mảng làm thông số câu lệnh đã chuẩn bị

Tôi có ArrayList của id bản ghi là loại Long ->ArrayList<Long>. Tôi muốn sử dụng danh sách các id hồ sơ này để chọn các hàng từ một bảng khác. Càng xa càng tốt. Bây giờ vào thử thách ...

a) Tôi đang sử dụng câu lệnh đã chuẩn bị để chọn dữ liệu từ bảng sử dụng ArrayList làm đầu vào cho việc này.

selectPS = dbConnection.prepareStatement("select columnA from tableA where id in ?"); 

Câu hỏi về thông số trên phải được xác định như thế nào? Ở trên dường như không chính xác cho thông số loại ArrayList.

b) Tôi cũng gặp sự cố khi đặt giá trị tham số cho câu lệnh được chuẩn bị . Không có phương pháp nào để đặt giá trị loại ArrayList và tôi không thấy tùy chọn nào khác khả thi .

---> selectPS.set?????(1, arraylistParameter); 
    ResultSet rs = selectPS.executeQuery(); 

Bất kỳ trợ giúp hoặc hướng nào bạn có thể đặt cho tôi đều được đánh giá cao.

Cảm ơn bạn.

+0

** Bạn có thể thử truyền một mảng không? **, [PreparedStatement # setArray()] (http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html # setArray (int, java.sql.Array))? Bạn cần phải tạo một mảng đầu tiên bằng cách sử dụng [Connection # createArrayOf()] (http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#createArrayOf (java.lang.String, java.lang.Object [])). Có một số cách được liệt kê [ở đây] (http://www.javaranch.com/journal/200510/Journal200510.jsp#a2). – NINCOMPOOP

+0

Tôi sẽ tự động tạo một String với '?' Cho mỗi phần tử trong mảng, gọi phương thức 'setLong' với mỗi giá trị, tăng chỉ số mỗi lần. –

+0

@Thomas Grady CBIP Cơ sở dữ liệu của bạn là gì? Nếu đó là Oracle, thì sẽ không hỗ trợ hơn 1000 bản ghi trong mệnh đề 'IN'. Bạn phải viết mệnh đề INNER JOIN để biết thêm thông tin - http://stackoverflow.com/questions/4722220/sql-in-clause-1000- item-limit – Prabhaker

Trả lời

32

Bạn có thể muốn sử dụng setArray phương pháp như đã đề cập trong javadoc dưới đây:

http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setArray(int, java.sql.Array)

Sample Code:

PreparedStatement pstmt = 
       conn.prepareStatement("select * from employee where id in (?)"); 
Array array = conn.createArrayOf("VARCHAR", new Object[]{"1", "2","3"}); 
pstmt.setArray(1, array); 
ResultSet rs = pstmt.executeQuery(); 
+0

@Yogendra ... Tôi đã xem xét đề xuất của bạn nhưng không thể làm cho nó hoạt động với Long. Tôi sẽ tiếp tục nghiên cứu đề xuất này khi tôi giải quyết vấn đề sản xuất trên tay. Cảm ơn. –

+10

Quay lại với bạn (và TNI) về đề xuất sử dụng mảng. Thật không may tôi không thể sử dụng điều đó do chúng tôi có MySQL làm cơ sở dữ liệu của chúng tôi. MySQL không hỗ trợ một mảng sql. Nó quá tệ vì điều này cũng đã giải quyết được nhu cầu của tôi. Cảm ơn sự giúp đỡ của bạn. –

+0

Về cơ bản tôi đang sử dụng mã này, tuy nhiên tôi nhận được một lỗi 'text = text []'. Có thể hiển thị truy vấn kết quả sẽ là gì không? Tôi mong đợi một cái gì đó như thế này: 'SELECT * FROM nhân viên, nơi id trong ('{" 1 "," 2 "," 3 "}')' như trong mã của tôi. –

13

Nếu bạn có ArrayList sau đó chuyển đổi thành Array [Object ]

ArrayList<String> list = new ArrayList<String>(); 
PreparedStatement pstmt = 
      conn.prepareStatement("select * from employee where id in (?)"); 
Array array = conn.createArrayOf("VARCHAR", list.toArray()); 
pstmt.setArray(1, array); 
ResultSet rs = pstmt.executeQuery(); 
-9

tại sao làm cho cuộc sống hard-

String parameters = StringUtils.join(arraylistParameter.iterator(),","); 
PreparedStatement pstmt =conn.prepareStatement("select * from employee 
         where id in ("+ parameters+)"); 
+9

Bởi vì SQL Injection – TameHog

-1

@JulienD Cách tốt nhất là để phá vỡ trên quá trình thành hai bước.

Bước 1: Cho phép nói 'rawList' làm danh sách bạn muốn thêm làm thông số trong câu lệnh đã chuẩn bị.

Tạo một danh sách khác:

ArrayList<String> listWithQuotes = new ArrayList<String>(); 

for(String element : rawList){ 
    listWithQuotes.add("'"+element+"'"); 
} 

Bước 2: dấu phẩy Make 'listWithQuotes' tách ra.

String finalString = StringUtils.join(listWithQuotes.iterator(),","); 

'finalString' sẽ là tham số chuỗi với mỗi phần tử được trích dẫn một lần và được phân tách bằng dấu phẩy.

+0

Đây là một ý tưởng tồi, bởi vì nó sẽ mở bạn đến SQL injection. –

Các vấn đề liên quan