【问题标题】:Get physical column value with entity property value using hibernate使用休眠获取具有实体属性值的物理列值
【发布时间】:2014-02-06 12:13:27
【问题描述】:

我有一个表 T,其中的列像往常一样定义。

@Entity
@Table(name="T")
public class T {
@Column(name="test_id")
private Long testId;

}

给定实体属性“testId”,我想获取相应的数据库列名称(即“test_id”)。怎么可能实现?

编辑 1: 我想将此列与实际数据库列名(test_id)保持在单独的位置,而不是 testId。我使用 HQL 从 DB 中获取这些值,这些值具有键作为实体名称(即 testId),并且我想要 DB 中的实际列名。

【问题讨论】:

  • 您能说明一下您的要求吗?是否要重命名代码中的字段?
  • 不,我不想重命名。我只想获取实体 columnName 对应的 db column_name。
  • 只是好奇:你为什么要这么做?
  • 我从 HQL 获得了这些逻辑值,并希望在审计中存储物理列名称以跟踪对该列所做的更改。
  • 似乎毫无意义。因为您仍然必须提供一个字符串,它是您的字段的名称,而不是列名的字符串

标签: java sql hibernate


【解决方案1】:

如果我正确理解了您的要求,您希望使用 HQL,同时为 DB 列和实体字段使用一致的名称,如下所示:

SELECT t.test_id FROM Test t 

而不是

SELECT t.testId FROM Test t 

只有一种方法可以做到这一点 - 将字段重命名为 test_id。 HQL 适用于实体,而不适用于数据库表,因此您必须在查询中使用正确的字段名称。

由于test_id 与通常的 Java 编码约定相矛盾,我建议不要这样做。

编辑:使用反射获取注释属性值将按照此大纲进行:

Field field = MyEntity.class.getDeclaredField("testId");
Column a = field.getAnnotation(Column.class);
String columnName = a.name();

【讨论】:

  • 我了解 HQL 适用于实体。我想要的是从实体属性中获取数据库列名(从 testId 中获取 test_id)。我读过 Hibernate Configurations 可以用于此,但不太确定方法。
  • 所以你想提取 Column 注释的name 属性,你可以使用反射。还是我又误会你了?
  • 正确!反射是做到这一点的一种方法:)
【解决方案2】:

我会尽量避免这种情况,但如果你确定需要它,请使用:

Configuration configuration = sessionFactory.getConfiguration();
PersistentClass persistentClass = configuration
                .getClassMapping(T.class.getName());
String columnName = ((Column) persistentClass.getProperty("testId")
                .getColumnIterator().next()).getName();

另见Get table column names in Hibernate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2012-01-14
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多