Spring Boot JPA 运行 DDL sql 如何使用动态表名?

How SpringBoot JPA run DDL sql with dynamic tableName?

是的,我得到了这个问题,jpa 运行 DDL sql 如何使用动态表名? 通常,我只是像 'select,insert,update,delete' 这样使用 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) 是否可以简单地使用动态表名?

你的问题好像由两部分组成

第一部分

can jpa run DDL sql

当然可以,只需使用 entityManager.createNativeQuery("CREATE TABLE ...").executeUpdate()。这可能不是最好的主意(您应该使用 Flyway 或 Liquibase 等数据库迁移工具来创建数据库),但它会起作用。

请注意,您可能 运行 遇到一些问题,例如不同的 RDBMS 对围绕 DDL 语句的事务有不同的要求,但大多数时候都可以很容易地解决。

您可能想知道如何在使用 Spring 数据时获取 EntityManager。有关如何创建自定义 存储库片段 的说明,请参阅 here,您可以在其中注入几乎任何您需要的内容。

第二部分

with dynamic tableName

JPA 仅支持查询中某些子句中的参数,而标识符不是其中之一。恐怕你需要使用字符串连接。

为什么要使用动态 table 名称?您的实体定义不会在 运行 时更改。静态 DDL 脚本通常不太容易出错。