SpringBoot JPA如何使用动态表名运行DDL sql?
Yestody,我有一个问题,jpa如何使用动态表名运行DDLSQL? 通常,我只是使用DQL和DML,比如“选择、插入、更新、删除”。 例如:SpringBoot JPA如何使用动态表名运行DDL sql?,jpa,spring-data-jpa,spring-boot-jpa,Jpa,Spring Data Jpa,Spring Boot Jpa,Yestody,我有一个问题,jpa如何使用动态表名运行DDLSQL? 通常,我只是使用DQL和DML,比如“选择、插入、更新、删除”。 例如: public interface UserRepository extends JpaRepository<User, Integer> { @Query(value = "select a.* from user a where a.username = ? and a.password = ?", nativeQuery =
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);
}
我没有找到用Jpa(或EntityManager)解决这个问题的方法。
最后,我使用JDBC运行DDLSQL,但我认为它很难看
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)吗?您的问题似乎由两部分组成 第一部分 jpa可以运行DDLSQL吗 当然,只需使用entityManager.createNativeQuery(“创建表…”)。executeUpdate()。这可能不是最好的主意(您应该使用Flyway或Liquibase之类的数据库迁移工具来创建数据库),但它会起作用 请注意,您可能会遇到一些问题,例如,不同的RDBMS对DDL语句周围的事务有不同的要求,但它们在大多数情况下都很容易解决 您可能想知道在使用Spring数据时如何获得
EntityManager
。有关如何创建自定义存储库片段的说明,请参见,您可以在其中注入几乎所有需要的内容
第二部分
使用动态表名
JPA只支持查询中某些子句中的参数,标识符不在其中。恐怕您需要使用字符串连接
为什么要使用动态表名呢?您的实体定义不会在运行时更改。静态DDL脚本通常不太容易出错 我尝试了
entityManager.createNativeQuery(“创建表…”).executeUpdate()
,但出现了一些错误,无法修复。我明白了,但没有找到解决办法。关于动态表名,我想备份数据库表或对数据拍照。您提醒我,我可以用另一种方式实现我的需求。好吧,没有看到错误,我无法完全判断出哪里出了问题。顺便说一句,我忘了告诉您,DDL还应该使用@Modifying@Query(nativeQuery=true,value=…)
,使用常规的存储库方法,而不使用存储库片段,但这样您就失去了提供表名dynamicallyOk的能力,我将以另一种方式考虑
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();
}