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

时间:2010-03-15 03:42:28

标签: java jpa ejb-3.0

我正在使用JPA,我需要将“tableName”变为变量。

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

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

有什么想法吗?

5 个答案:

答案 0 :(得分:6)

我猜你可以做这样的事情。 没试过,只是一个疯狂的猜测。但这就是通常的做法 - 我遵循命名查询;是的,这完全是另一回事。

@Entity
@Table(name = Database.tableName)
public class Database implements Serializable {
    public static final String tableName = "TABLE_1";
    ...............
}

但我不明白为什么有人会这样做。你能告诉我们你在忙什么吗?为什么几张表的定义完全相同?

<强> [编辑]

  

我尝试了你的解决方案。它没   工作,它说:价值   注释属性Table.name必须   是一个不变的表达。

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

答案 1 :(得分:3)

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

@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.
    ...............
}

答案 2 :(得分:2)

无法在运行时指定表名,这根本不是JPA的工作原理(我仍然不确定是否满足您的要求)。根据来自客户端的输入使用除JPA之外的其他内容(如iBATIS),映射您的一组表上的不同实体并运行各种查询或动态构建它们(可能使用Criteria API)。

答案 3 :(得分:0)

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

然后你可以使用:

@Subselect("")

而不是:

@Table(name = "tableName")

答案 4 :(得分:0)

我有一个解决方法。
它使用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;
    }
}

调用代码是:

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

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