#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. Никаких конкретных планов нет, но это абсолютно в пределах того, что мы могли бы рассмотреть. Не стесняйтесь создавать для этого тикет.