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 脚本通常不太容易出错。
是的,我得到了这个问题,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 脚本通常不太容易出错。