0

Yestody,我有这个问题,jpa 如何使用动态表名运行 DDL sql?通常,我只使用 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 能否以简单的方式使用动态 tableName 运行 DDL sql(如 CREATE/DROP/ALTER)?

4

1 回答 1

0

您的问题似乎由两部分组成

第一部分

jpa可以运行DDL sql吗

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

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

您可能想知道EntityManager在使用 Spring Data 时如何获取一个。有关如何创建自定义存储库片段的说明,请参见此处,您可以在其中注入几乎任何您需要的东西。

第二部分

带有动态表名

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

为什么是动态表名呢?这不像您的实体定义会在运行时更改。静态 DDL 脚本通常不易出错。

于 2019-10-23T20:56:04.050 回答