Java 使用hibernate获取具有实体属性值的物理列值

Java 使用hibernate获取具有实体属性值的物理列值,java,sql,hibernate,Java,Sql,Hibernate,我有一个表T,其中列的定义与往常一样 @Entity @Table(name="T") public class T { @Column(name="test_id") private Long testId; } 给定实体属性“testId”,我想得到相应的DB列名(即“test_id”)。如何实现这一目标 编辑1: 我想用实际的DB列名(test_id)而不是testId将此列保留在单独的位置。我使用HQL从DB中获取这些值,HQL的键作为实体名称(即testId),我想要DB中的实际列

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

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

}
给定实体属性“testId”,我想得到相应的DB列名(即“test_id”)。如何实现这一目标

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

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

SELECT t.test_id FROM Test t 
而不是

SELECT t.testId FROM Test t 
只有一种方法可以做到这一点——将字段重命名为
test\u id
。HQL适用于实体,而不是DB表,因此必须在查询中使用正确的字段名

由于
test\u id
与通常的Java编码约定相矛盾,我建议不要这样做

编辑:通过反射获取注释属性值将沿着以下轮廓工作:

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

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

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

另请参见

您能否澄清您的要求?是否要重命名代码中的字段?不,我不想重命名。我只想获取对应于实体columnName的db column_name。只是好奇:为什么要这样做?我从HQL获得了这些逻辑值,并想在审计中存储物理列名,以跟踪对该列所做的更改。这似乎毫无意义。因为您仍然需要提供一个作为字段名的字符串,而不是列名的字符串,所以我理解HQL在实体上工作。我想要的是从entity属性获取DB列名(从testId获取test_id)。我已经读到Hibernate配置可以用于此目的,但不太确定方法。因此,如果要提取列注释的
name
属性,可以使用反射。还是我又误解你了?没错!反射是实现这一点的一种方法:)