Java 在@Table(name=“tableName”)-使“tableName”成为JPA中的变量

Java 在@Table(name=“tableName”)-使“tableName”成为JPA中的变量,java,jpa,ejb-3.0,Java,Jpa,Ejb 3.0,我正在使用JPA,我需要将tableName设置为一个变量 在数据库中,我有许多表,我的代码需要访问我指定要读取的表 @Entity @Table(name = "tableName") public class Database implements Serializable {...............} 有什么想法吗?我想,如果这是你关心的问题,你可以这样做。从来没有试过,只是胡乱猜测而已。但这是通常的做法——我遵循命名查询;是的,那完全是另一回事 @Entity @Table(na

我正在使用JPA,我需要将tableName设置为一个变量

在数据库中,我有许多表,我的代码需要访问我指定要读取的表

@Entity
@Table(name = "tableName")
public class Database implements Serializable {...............}

有什么想法吗?

我想,如果这是你关心的问题,你可以这样做。从来没有试过,只是胡乱猜测而已。但这是通常的做法——我遵循命名查询;是的,那完全是另一回事

@Entity
@Table(name = Database.tableName)
public class Database implements Serializable {
    public static final String tableName = "TABLE_1";
    ...............
}
但我不明白为什么有人会这么做。你能告诉我们你在忙什么吗?为什么几乎没有完全相同定义的表

[已编辑]

我试过你的解决办法。事实并非如此 它说:工作的价值 注释属性Table.name必须为空 这是一个恒定的表达式


那么,这还不够清楚吗?我是说你不能那样做。我相信这很合乎逻辑。如果您希望Hibernate生成您的模式,那么您可以在模式中定义您想要的所有实体,并使用适当的关系。

在运行时指定表名是不可能的,这根本不是JPA的工作方式,我仍然不确定是否能满足您的要求。映射表集合上的不同实体并运行各种查询,或者根据客户端的输入使用Criteria API动态构建它们,或者使用JPA以外的其他工具,如iBATIS。

如果您只想引用/读取表名,可以使用下面的代码。如果你想改变,就像帕斯卡说的那样,这是不可能的

@Entity
@Table(name = Database.tableName)
public class Database implements Serializable {
    public static final String tableName = "TABLE_1";//this variable you can reference in other portions of your code. Of course you cannot change it.
    ...............
}

如果要从不同的表中选择数据

然后您可以使用:

@再选择

而不是:

@Tablename=Tablename。

我有一个解决方法。 它使用javax.persistence.EntityManager和String.format来实现这一点

package com.example.test.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import javax.persistence.EntityManager;

@Component
public class SomeDao {
    @Autowired
    EntityManager em;

    public List<?> listFoodMoneyDateOfPayment(int departmentId, String sumKey, String tableName) {
        String s = "SELECT SUM(%s) AS money, CONCAT(YEAR(apply_time), '-', MONTH(apply_time)) AS yearmonth " +
                "FROM (%s) WHERE department_id = %d GROUP BY yearmonth";
        String sql = String.format(s, sumKey, tableName, departmentId);
        System.out.println(sql);

        List<?> test = em.createNativeQuery(sql).getResultList();

        return test;
    }
}

而且效果很好。
但是您应该检查传入的参数。

我的代码需要访问我指定要读取的表。请你澄清你想做什么。请看我对答案1的评论。谢谢。换句话:我需要动态模式。动态创建表的位置。是否要在运行时创建新表???每当我听说数据库架构包含可变数量的表时,我知道有人缺少基本的关系数据库原则。好的,这是我的场景。我有一个名为Database的JPA类,根据客户端的输入数据,我可以有许多表。因此,目前,数据库类在运行@table=name时只创建一个表。但是我需要这个类在运行时使用来自其他地方的TableName变量创建表。我试过你的解决办法。它不起作用,它说:注释属性Table.name的值必须是一个常量表达式。换言之:我需要动态架构。表格是在哪里动态创建的。@zengr:查看我的文章附录。谢谢你的帮助:我正在使用JPA,还有一个问题,em.createNativeQuerycreate表SQL查询是否有效?EntityManager em.在哪里?这篇文章是一个解决方法吗?这是一个可能的解决办法吗@我不能回答这个问题,我还是不明白你想做什么。动态表?不同的模式?这是不清楚的。@zengr它看起来确实像这个链接做了你想要的,尽管它可以完全混淆维护工程师的事情。Hibernate碎片也是一个有趣的选择。但当你朝这个方向走的时候,要问自己很多次,你真的需要这个吗?。你的项目真的很复杂吗?要保证这个复杂的解决方案?
@RestController
@RequestMapping("/api")
public class TestController {

    @Autowired
    private SomeDao dao;

    @RequestMapping("/test2")
    public HttpEntity test2() {
        var l = dao.listFoodMoneyDateOfPayment(12, "food_payment", "payment_application");
        System.out.println(l.getClass());
        System.out.println(JSON.toJSONString(l));
        return ResultBean.success();
    }
}