SQL-запрос JavaBean к базе данных MySQL, в два раза показывает результаты только в JSF - PullRequest
1 голос
/ 22 января 2011

У меня странная проблема при запросе базы данных 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

1 Ответ

0 голосов
/ 22 января 2011

Не выполняйте операции с БД в получателе компонента.Сделайте это в конструкторе бобов.Симптомы указывают на то, что вы обладаете свойством List и заполняете его внутри геттера вместо конструктора.Получатель может вызываться несколько раз в течение жизни бина.Его единственная задача - возвращать данные, а не заниматься бизнесом.


Обновление , как я и предсказывал, вы занимаетесь бизнесом внутри геттера.Это не так, как это работает.Переместите этот код в конструктор.

public class Bean {
    public List list;

    public Bean() {
        // Fill the list here.
    }

    public List getList() {
        return list; // Do nothing else in the getter!
    }
}

См. Также:


Не связано с конкретной проблемойу вас есть серьезные проблемы в подходе к коду JDBC.Ресурсы объявляются как поля класса вместо локальных полей метода, и они не закрываются должным образом в блоке finally.Чувствителен к утечкам ресурсов.Я бы посоветовал ознакомиться с этой статьей , чтобы на собственном примере узнать, как правильно выполнять JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...