我正在使用JPA,我需要将“tableName”变为变量。
在数据库中,我有很多表,我的代码需要访问我指定要读取的表。
@Entity
@Table(name = "tableName")
public class Database implements Serializable {...............}
有什么想法吗?
答案 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();
}
}
而且效果很好。
但是您应该检查传入的参数。