java 在@Table(name =“tableName”)中-将“tableName”作为JPA中的变量

tf7tbtn2  于 2023-04-28  发布在  Java
关注(0)|答案(6)|浏览(293)

我正在使用JPA,我需要将“tableName”设置为变量。
在数据库中,我有许多表,我的代码需要访问我指定要读取的表。

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

有什么想法吗

tzxcd3kk

tzxcd3kk1#

你可以做这样的事情,如果这是你的关注,我想。从来没有尝试过,这只是一个疯狂的猜测。但这是通常的做法--我遵循命名查询;是的,那完全是另一回事。

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

但我不明白为什么有人会这么做。你能告诉我们你在做什么吗?为什么你有几个表完全相同的定义?
[编辑]**
我试过你的解决办法了。它没有工作,它说:注解属性的值www. example www.example.com 必须是常量表达式。
这还不够清楚吗我是说你不能这么做。我相信这是很合乎逻辑的。如果你想让Hibernate生成你的模式,那么你可以在模式中定义所有你想要的实体,并使用适当的关系。

wbrvyc0a

wbrvyc0a2#

在运行时指定表名是不可能的,这根本不是JPA的工作方式(我仍然不确定是否能得到您的要求)。或者Map表集上的不同实体并运行各种查询,或者根据客户端的输入动态构建它们(可能使用Criteria API)或者使用JPA以外的东西(比如iBATIS)。

omjgkv6w

omjgkv6w3#

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

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

cmssoen24#

我有个变通办法。
使用javax。坚持不懈EntityManager和String。格式来做到这一点。

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

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

nxowjjhe

nxowjjhe5#

如果要从不同的表中选择数据,
然后你可以用途:
@Subselect("")
而不是:
@Table(name = "tableName")

n3schb8v

n3schb8v6#

我们可以利用接口常量并在annotation处初始化

这是可能的,因为所有接口变量默认都是常量。

interface DomainPropertiesHelper {
 String TABLE_NAME = "DB_TABLE";
} 

@Entity
@Table(name = DomainPropertiesHelper.TABLE_NAME)
class Database implements Serializable {
 @Id
 private Long id;
}

相关问题