Nano Hash - криптовалюты, майнинг, программирование

org.postgresql.util.PSQLException: ОШИБКА: оператор не существует: целое число = байт

Я пытаюсь выполнить собственный запрос из приложения Spring Boot, но получаю сообщение об ошибке "org.postgresql.util.PSQLException: ERROR: оператор не существует: integer = bytea"

Вот коды, которые я написал для реализации этого

  @SqlResultSetMapping(
    name = "StudentAssessmentValue",
    classes = @ConstructorResult(
            targetClass = StudentAssessmentDTO.class,
            columns = {
                    @ColumnResult(name = "subject_title", type = String.class),
                    @ColumnResult(name = "assessment", type = String.class),
            }
    )
  )


  @NamedNativeQuery(
                    name = "getStudentSubjectsAssessment",
                    query = "SELECT\n" +
                            "   subject.subject_title,\n" +
                            "   j as assessment\n" +
                            "FROM   assessment s\n" +
                            "JOIN   LATERAL jsonb_array_elements(s.assessment) j(elem) ON (j.elem->>'student_id') = :student_id\n" +
                            "JOIN subject ON subject.id = s.subject_id\n" +
                            "WHERE s.subject_id IN (:subjects)\n" +
                            "AND s.academy_year_id = :academy_year_id\n" +
                            "AND s.term_id = :term_id\n" +
                            "AND s.section_id = :section_id"
                    ,
                    resultSetMapping = "StudentAssessmentValue"
            )

Это код в моем репозитории

 @Query(nativeQuery = true, name = "getStudentSubjectsAssessment")
  List<StudentAssessmentDTO> getStudentAssessments2(
        @Param("student_id") String student_id,
        @Param("academy_year_id") Integer academy_year_id,
        @Param("section_id") Integer section_id,
        @Param("term_id") Integer term_id,
        @Param("subjects") Integer[] subjects
);

И это у меня в контроллере

   @GetMapping("/{student_id}/{academy_year_id}/{section_id}/
   term_id}")
    public List<StudentAssessmentDTO> getStudentAssessment2(
        @PathVariable("student_id") String student_id,
        @PathVariable("academy_year_id") Integer academy_year_id,
        @PathVariable("section_id") Integer section_id,
        @PathVariable("term_id") Integer term_id,
        @RequestParam(value = "subjects") Integer[] subjects
   ){
    return assessmentService.getStudentAssessments2(student_id, academy_year_id, section_id, term_id, subjects);
   }

Я также заметил, если я удалю эту часть из запроса WHERE s.subject_id IN (: themes) или скажу, что я жестко запрограммировал значение subject, например, s.subject_id IN (2,3,4), код работает успешно. Но если значение исходит из запроса, я получаю ошибку. Вот как выглядит запрос

локальный: 8080 / оценка / f3df0bc2-7b4c-49b9-86c9-6e6b01628623 / 3/4/1? субъектов = 2,3,4


Ответы:


1

Недавно у меня была проблема, аналогичная вашей, хотя также работает с собственным запросом JPA в Postgres. Вот что у меня сработало:

// sqlString contains your native query

Query query = entityManager.createNativeQuery(sqlString, StudentAssessmentDTO.class);
query.setParameter("subjects", subjects);
query.setParameter("academy_year_id", new TypedParameterValue(IntegerType.INSTANCE, academy_year_id));
query.setParameter("term_id", new TypedParameterValue(IntegerType.INSTANCE, term_id));
query.setParameter("section_id", new TypedParameterValue(IntegerType.INSTANCE, section_id));
List< StudentAssessmentDTO > = query.getResultList();

Ошибка, которую вы видите, может быть объяснена неспособностью драйвера Postgres JDBC правильно передать необходимую информацию о типе в базу данных. Например, следующая ошибка:

ОШИБКА: оператор не существует: целое число = байт

произойдет, потому что драйвер передает параметр в Postgres как массив байтов, но целевой столбец имеет целочисленный тип. Используя указанные выше «подсказки», мы можем заставить драйвер передать правильную информацию о типе.

08.10.2019
  • Спасибо за ответ. Я пытаюсь реализовать ваше решение, но теперь я получаю эту ошибку. Неизвестный объект: com.aprisoft.eagle_eye.dto.StudentAssessmentDTO, вы должны знать, что это просто такой класс, как открытый класс StudentAssessmentDTO реализует Serializable {private static финальный длинный serialVersionUID = 1L; частная строка subject_title; @JsonRawValue оценка частной строки; } 08.10.2019
  • Как называется класс сущности? Я не был в этом уверен, поэтому просто прошел курс DTO. 08.10.2019
  • Класс DTO предназначен для десериализации набора результатов, который я получаю из запроса, поэтому диспетчер сущностей десериализует набор результатов с использованием класса, который не является сущностью? 08.10.2019
  • Этот класс аннотирован с @Entity в самом верху определения класса? Просто поищите в своей кодовой базе @Entity, чтобы узнать, какие классы у вас есть. 08.10.2019
  • Это ошибка, с которой я сейчас сталкиваюсь org.postgresql.util.PSQLException: ОШИБКА: оператор не существует: integer = integer [] 08.10.2019
  • Используйте: query.setParameter("subjects", subjects) ... если я правильно помню, вам не понадобится подсказка типа для коллекции. 08.10.2019

  • 2

    Возможно, это не лучшее решение, но оно работает для меня, я буду рад, если кто-нибудь сможет предложить лучшее решение.

    Вот что я сделал:

    Я написал метод, который возьмет массив, полученный из запроса, и сгенерирует строку такого рода "(a,b,c)", а затем добавил эту строку в мою строку запроса, и она будет работать

    КОД

    Это метод построения строки ПРИМЕЧАНИЕ: я могу позволить себе использовать эту функцию, потому что я точно знаю, что их элемент этого массива не растет быстро, max для моего случая будет 15

     public String generateInSearchParameter(Integer[] inputArr){
        StringBuilder search = new StringBuilder("(");
    
        IntStream.range(0, inputArr.length).forEach(i -> {
            if (i != inputArr.length - 1) {
                search.append(inputArr[i]).append(',');
            } else {
                search.append(inputArr[i]);
            }
        });
    
         search.append(")");
    
         return search.toString();
      }
    

    Вот код контроллера

     @GetMapping("/{student_id}/{academy_year_id}/{section_id}/{term_id}")
        public List<StudentAssessmentDTO> getStudentAssessment2(
                @PathVariable("student_id") String student_id,
                @PathVariable("academy_year_id") Integer academy_year_id,
                @PathVariable("section_id") Integer section_id,
                @PathVariable("term_id") Integer term_id,
                @RequestParam(value = "subjects") Integer[] subjects
        ){
            return assessmentService.getStudentAssessments2(student_id, academy_year_id, section_id, term_id,generateInSearchParameter(subjects));
    
        }
    

    Вот код в моей службе

    public List<StudentAssessmentDTO> getStudentAssessments2(
                String student_id, Integer academy_year_id,
                Integer section_id, Integer term_id, String subjects
        ){
    
            String sqlString = "SELECT" +
                    " subject.subject_title," +
                    " j.*" +
                    " FROM  assessment s" +
                    " JOIN   LATERAL jsonb_array_elements(s.assessment) j(elem) ON (j.elem->>'student_id') = :student_id" +
                    " JOIN subject ON subject.id = s.subject_id" +
                    " WHERE s.academy_year_id = :academy_year_id" +
                    " AND s.section_id = :section_id" +
                    " AND s.subject_id IN " + subjects +
                    " AND s.term_id = :term_id";
    
            Query query = entityManager.createNativeQuery(sqlString, "StudentAssessmentValue");
            query.setParameter("academy_year_id", new TypedParameterValue(IntegerType.INSTANCE, academy_year_id));
            query.setParameter("term_id", new TypedParameterValue(IntegerType.INSTANCE, term_id));
            query.setParameter("section_id", new TypedParameterValue(IntegerType.INSTANCE, section_id));
            query.setParameter("student_id", new TypedParameterValue(StringType.INSTANCE, student_id));
    
            return query.getResultList();
    
        }
    

    Я буду рад приветствовать лучшее решение, если оно будет предоставлено

    08.10.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..