Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringBoot JPA如何使用动态表名运行DDL sql?_Jpa_Spring Data Jpa_Spring Boot Jpa - Fatal编程技术网

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

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 =

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 = 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();
}