возврат функции (MySQL + Spring) - PullRequest
0 голосов
/ 27 октября 2011

У меня проблема с использованием функции, созданной в MySQL через код, который использует класс Spring JdbcTemplate.

Когда я тестирую функцию прямо в Workbench, она работает правильно, возвращая true или false в соответствии с прошлыми записями. Однако, когда я пытаюсь получить результат с помощью Java-кода, всегда возвращается false, что приводит меня к мысли, что это некое преобразование типов.

Почему переменная 'result' всегда ложна?

  • функция

    CREATE DEFINER=`root`@`localhost` 
    FUNCTION `COMPARA_QTDE_EMPRESA`(AG INT, P INT, ANO INT, AINSERIR INT) 
    RETURNS tinyint(1) DETERMINISTIC  
    BEGIN  
      DECLARE TOTAL_EMPRESA_PESQUISA INT;  
      DECLARE TOTAL_EMPRESA_AGENTE INT;  
    
      SELECT IF(COUNT(*), EP.TOTAL, 0) INTO TOTAL_EMPRESA_PESQUISA  
        FROM CTRLPRODUCAO.EMPRESA_PESQUISA EP  
        WHERE EP.AGENCIA = AG  
        AND EP.PESQUISA = P  
        AND EP.ANO = ANO;  
    
      SELECT IFNULL(SUM(EA.TOTAL), 0) INTO TOTAL_EMPRESA_AGENTE  
        FROM CTRLPRODUCAO.EMPRESA_AGENTE EA  
        WHERE EA.AGENCIA = AG  
        AND EA.PESQUISA = P  
        AND EA.ANO = ANO;  
    
      RETURN 
        IF(TOTAL_EMPRESA_PESQUISA = 0
           , FALSE
           ,(TOTAL_EMPRESA_PESQUISA < (TOTAL_EMPRESA_AGENTE) + AINSERIR));  
    

    END

  • Java-код

    (...)  
    Object[] args = new Object[4];  
    int[] tipos = new int[4];  
    args[0] = ag.getId();   tipos[0] = Types.INTEGER;  
    args[1] = p.getId();   tipos[1] = Types.INTEGER;  
    args[2] = ano.getAno();   tipos[2] = Types.INTEGER;  
    args[3] = total.getTotal();   tipos[3] = Types.INTEGER;  
    
    boolean result = (Boolean)getJdbcTemplate().queryForObject("SELECT COMPARA_QTDE_EMPRESA (?, ?, ?, ?)"), args, tipos, Boolean.class);
    

1 Ответ

0 голосов
/ 27 октября 2011

MySQL boolean - псевдоним для tinyint(1).
Это означает, что вы используете правильный тип.

Обратите внимание, что 1 = истина, 0 = ложь.

Так что, если вы хотите получить результат в своем Java-коде, все, что вам нужно сделать, это проверить возвращаемое значение против 0.

Изменить код Java на:

boolean result = (getJdbcTemplate().queryForObject("SELECT COMPARA_QTDE_EMPRESA (?, ?, ?, ?)")
                                                   , args, tipos, Integer.class) != 0);
...