У меня странная проблема при запросе базы данных MySQL из Javabean и ее отображении в JSF. (Код Java внизу)
Таблица содержит следующие регистры:
mysql> select * from trescols;
+----+---------+---------+
| id | camp1 | camp2 |
+----+---------+---------+
| 1 | fila1A | fila1B |
| 2 | fila2A | fila2B |
| 3 | fila3A | fila3B |
| 4 | fila4A | fila4B |
...
| 20 | fila20A | fila20B |
+----+---------+---------+
Ok! Давайте продолжим процесс, пока он не сработал:
Прежде всего, я запросил базу данных большим запросом, и он не работал, поэтому я начал с простого запроса и добавил пошаговые инструкции.
Прежде всего, я запросил в БД следующий запрос:
SELECT * FROM trescols;
Все хорошо, это было хорошо показано на странице результатов с JSF.
Далее я запросил следующее:
SELECT * FROM tabla WHERE id%2=1;
Все хорошо, просто показывались записи с нечетным идентификатором.
Проблема возникла, когда я запросил:
SELECT * FROM tabla WHERE id%2=1 AND campo1 LIKE '%7%';
Я ожидал, что он покажет регистры с нечетным идентификатором и содержащие строку '7' где-нибудь в столбце "camp1".
Результат с JSF был:
ID Camp1 Camp2
7 fila7A fila7B
17 fila17A fila17B
7 fila7A fila7B
17 fila17A fila17B
Пока тот же запрос из mysql cli возвращает:
mysql> select * from trescols where id%2=1 and camp1 LIKE '%7%';
+----+---------+---------+
| id | camp1 | camp2 |
+----+---------+---------+
| 7 | fila7A | fila7B |
| 17 | fila17A | fila17B |
+----+---------+---------+
2 rows in set (0.10 sec)
Я добавил LIMIT 1, 1
в строку запроса и удалил id%2=1 AND
, и возвращает:
ID Camp1 Camp2
17 fila17A fila17B
17 fila17A fila17B
Ожидаемый результат должен был просто показать один раз второй регистр, а не дважды. Удаление первого условия состояло лишь в том, чтобы убедиться, что двойное условие не является причиной для дублированных результатов, и исключить неправильный запрос SQL.
Затем я сделал хранимую процедуру следующим образом:
mysql> CREATE PROCEDURE getTrescols3()
-> BEGIN
-> SELECT * FROM trescols WHERE camp1 LIKE '%7%';
-> END
-> //
Вызов этого из CLI MySQL работает нормально:
mysql> call gettrescols3();
+----+---------+---------+
| id | camp1 | camp2 |
+----+---------+---------+
| 7 | fila7A | fila7B |
| 17 | fila17A | fila17B |
+----+---------+---------+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Но вызов из JSF снова показывает это дважды !!!
ID Camp1 Camp2
7 fila7A fila7B
17 fila17A fila17B
7 fila7A fila7B
17 fila17A fila17B
И вот где я потерян ... Я мог понять, что запрос может - по какой-то причине, хотя он не должен показывать дублированные результаты, затем я начал с простого запроса, добавляя предложения в строку, пока он не показал дублированные результаты. С одним условием все работало нормально, с двумя - с дублированными результатами. Затем я удалил первое из двух условий, с которыми у него не было никаких проблем, и оставил только второе условие, оно показало дублированные результаты. Тогда я подумал, что, возможно, у java возникли проблемы с условием <field> LIKE '%7%'
, поэтому я создал хранимую процедуру в MySQL, чтобы Java не обрабатывал строку запроса, а просто вызывал SP и получал результат, вызывал его из CLI и работал нормально, вызвал его из бобов java и показал дублированные результаты.
Я не знаю, какие еще тесты нужно делать ... Я отбросил неправильный запрос SQL, потому что в CLI все работало, как ожидалось, и просто не получалось при добавлении условия <field> LIKE '%7%'
, а просто сбой в JSF, а не в mysql cli Кроме того, я снова исключил неправильный запрос, потому что, вызывая SP из Java-бина и из Cli, он работал в Cli, но не из Java-бина ...
Я пытался получить все результаты из таблицы "trescols", где id%2=1
и где поле "camp1" содержит 7.
Я использую соединитель mysql jdbc для подключения к БД.
Не могли бы вы помочь мне, пожалуйста.
С уважением,
Карлес
Java-код:
package beans;
import java.sql.*;
import java.util.*;
public class beanNomesRetorna {
Connection con;
Statement ps;
ResultSet rs;
private List llista = new ArrayList();
public List getLlista() {
int i=0;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/provesjsf","root","pa$$word");
ps = con.createStatement();
rs = ps.executeQuery("SELECT * FROM trescols WHERE id%2 = 1 AND camp1 LIKE '%7%' ORDER BY id LIMIT 0,2");
while(rs.next()) {
System.out.println(rs.getString(1));
llista.add(i, new agafaInfo(Integer.parseInt(rs.getString("id")), rs.getString("camp1"), rs.getString("camp2")));
i++;
} // while
} catch(Exception e) {
System.out.println(e);
} // try ... catch
return llista;
} // getLlista
package beans;
public class agafaInfo {
int id;
String camp1;
String camp2;
agafaInfo(int parid, String parcamp1, String parcamp2) {
this.id = parid;
this.camp1 = parcamp1;
this.camp2 = parcamp2;
}
public int getParid() {
return id;
}
public String getCamp1() {
return camp1;
}
public String getCamp2() {
return camp2;
}
} // agafaInfo