Ho questa banale funzione che tramite un PreparedStatement fa una SELECT banalissima di alcuni campi di una tabella, non tutti.

codice:
public static ResultSet lanciaPreparedStatement(String stringaSQL, String[] parametri) throws SQLException {
	PreparedStatement ps = cn.prepareStatement(stringaSQL);
	// Imposto i parametri del PreparedStatement
	for (int i=0; i<parametri.length; i++) {
		ps.setString(i+1, parametri[i]);
	}
	ResultSet rs = ps.executeQuery();
	return rs;
}
I parametri passati al metodo sono corettissimi, eccone il contenuto (verificati con print su console):

codice:
stringaSQL = "SELECT ?, ?, ? FROM tb_client"
parametri[0] = "campo_1"
parametri[1] = "campo_2"
parametri[2] = "campo_3"
In basso la struttura di tb_client, ha 50 record, qui ho limitato la visualizzazione a 10.
codice:
mysql> select * from tb_client limit 10;
+----+---------+---------+---------+---------+---------+
| id | campo_1 | campo_2 | campo_3 | campo_4 | campo_5 |
+----+---------+---------+---------+---------+---------+
|  1 | 1       | 1       | 1       | 1       | 1       |
|  2 | 2       | 2       | 2       | 2       | 2       |
|  3 | 3       | 3       | 3       | 3       | 3       |
|  4 | 4       | 4       | 4       | 4       | 4       |
|  5 | 5       | 5       | 5       | 5       | 5       |
|  6 | 6       | 6       | 6       | 6       | 6       |
|  7 | 7       | 7       | 7       | 7       | 7       |
|  8 | 8       | 8       | 8       | 8       | 8       |
|  9 | 9       | 9       | 9       | 9       | 9       |
| 10 | 10      | 10      | 10      | 10      | 10      |
+----+---------+---------+---------+---------+---------+
Il risultato, dovrebbe essere una banale:
codice:
SELECT campo_1, campo_2, campo_3 FROM tb_client
e quindi una tabella identica a quella sopra ma che visualizza solo i tre campi, è invece una tabella con 50 record (e fin qui ci siamo) ma con i valori dei record assurdi, guardate sotto:

codice:
RISULTATO PREPARED STATEMENT
campo_1|campo_2|campo_3|
campo_1|campo_2|campo_3|
campo_1|campo_2|campo_3|
campo_1|campo_2|campo_3|
campo_1|campo_2|campo_3|
campo_1|campo_2|campo_3|
campo_1|campo_2|campo_3|
campo_1|campo_2|campo_3|
... fino a 50 (azzecca però il totale record), come mai?
Mi sembra un po' assurda come cosa, se invece di un PreparedStatement faccio una query normale passando la stringa scritta a mano per intero funziona...