Как я могу запустить пользовательский SQL с Spring Data JDBC без @Query?

#java #spring-data #spring-data-jdbc

#java #spring-данные #spring-data-jdbc

Вопрос:

Есть ли возможность запустить какой-либо пользовательский SQL-запрос, сгенерированный с помощью сторонних инструментов, таких как, например, jOOQ, и при этом воспользоваться функциями сопоставления Spring Data JDBC, то @Column есть аннотациями? Я не хочу использовать @Query аннотации.

 class Model { @Id private Long id; @Column("column") private String prop; }

class MyRepo {
  public Model runQuery() {
    val queryString = lib.generateSQL()
    // run query as if it has been generated by Spring Data JDBC and map
    // results to Model automatically
  }
}

 

Комментарии:

1. Если вы используете jooq, вы можете использовать его для выполнения запроса в базе данных также с моделями, созданными jooq

2. Похоже, вы имеете в виду QueryDSL, но он больше не поддерживается Spring Data JDBC. Вы можете использовать его с JPA просто отлично. github.com/querydsl/querydsl

Ответ №1:

Возможно, JdbcTemplate может решить вашу проблему? В частности, один из методов queryForObject() может представлять интерес, поскольку вы запрашиваете один объект:

 class MyRepo {
    private JdbcTemplate jdbcTemplate;

    @Autowired
    MyRepo(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }        

    public Model runQuery() {
        val query = lib.generateQuery();
        return jdbcTemplate.queryForObject(query, Model.class);
    }
}
 

Дополнительную информацию и другие варианты использования можно найти в руководстве Spring Доступ к реляционным данным с помощью JDBC с помощью Spring

Комментарии:

1. Это определенно один из вариантов, но я боюсь, что шаблон Spring jdbc не будет учитывать сопоставление, указанное в классе модели. Если есть какой-то способ получить экземпляр тех же самых данных Spring для сопоставления строк, которые JDBC использует под ними, то это действительно решает проблему.

2. @mcjkwlczk Я думаю, это зависит от того, как настроена таблица базы данных, какие запросы вы будете выполнять, как выглядят сопоставления и как работает сторонний инструмент. Например, если id столбец настроен с AUTO_INCREMENT помощью или другими способами генерации уникальных идентификаторов, это может сработать. Аналогично, если сторонний инструмент, который вы используете для генерации SQL-запросов, анализирует Model класс и способен преобразовывать сопоставления в соответствующую строку SQL-запроса, он также может работать.

3. RowMapper Использованный — это EntityRowMapper и есть общедоступный github.com/spring-projects/spring-data-jdbc/blob/master /…

4. @JensSchauder есть ли какие-либо планы разрешить пользователям выполнять свои собственные инструкции sql отдельно от @Query аннотаций? Возможно, как часть JdbcAggregateOperations интерфейса

5. Никаких конкретных планов нет, но это абсолютно в пределах того, что мы могли бы рассмотреть. Не стесняйтесь создавать для этого тикет.