Как SpringBoot JPA запускает DDL sql с динамическим tableName? - PullRequest
0 голосов
/ 23 октября 2019

Yestody, у меня возник этот вопрос, как jpa запустить DDL sql с динамическим tableName? обычно я просто использовал DQL и DML как «выбрать, вставить, обновить, удалить». например:

public interface UserRepository extends JpaRepository<User, Integer> {

    @Query(value = "select a.* from user a where a.username = ? and a.password = ?", nativeQuery = true)
    List<User> loginCheck(String username, String password);

}

, но когда мне нужно запустить DDL sql ниже

String sql = "create table " + tableName + " as select * from user where login_flag = '1'";

, я не нахожу способ решить эту проблему с помощью Jpa (или EntityManager). Наконец, я использовал JDBC для запуска DDL sql, но я думаю, что это уродливо ...

Connection conn = null;
PreparedStatement ps = null;
String sql=" create table " + tableName + " as select * from user where login_flag = '1' ";
try {
    Class.forName(drive);
    conn = DriverManager.getConnection(url, username, password);
    ps = conn.prepareStatement(sql);
    ps.executeUpdate();
    ps.close();
    conn.close();
} catch (Exception e) {
    e.printStackTrace();
}

Итак, может ли jpa легко запустить DDL sql (например, CREATE / DROP / ALTER) с динамическим tableName

1 Ответ

0 голосов
/ 23 октября 2019

Ваш вопрос, кажется, состоит из двух частей

Первая часть

Может ли jpa запустить DDL sql

Конечно, просто используйте entityManager.createNativeQuery("CREATE TABLE ...").executeUpdate(). Вероятно, это не лучшая идея (для создания БД вы должны использовать инструмент миграции базы данных, такой как Flyway или Liquibase), но он будет работать.

Обратите внимание, что вы можете столкнуться с некоторыми проблемами, например, разные СУБД предъявляют разные требования к транзакциям вокруг операторов DDL, но в большинстве случаев их можно решить довольно легко.

Вы, вероятно, задаетесь вопросом, как получить EntityManager при использовании Spring Data. См. здесь для объяснения того, как создавать собственные фрагменты репозитория , где вы можете ввести практически все, что вам нужно.

Вторая часть

с динамическим tableName

JPA поддерживает параметры только в определенных предложениях в запросе, а идентификаторыни один из них. Боюсь, вам нужно использовать конкатенацию строк.

Почему же имена динамических таблиц? Это не значит, что ваши определения сущностей будут меняться во время выполнения. Статические сценарии DDL обычно менее подвержены ошибкам.

...