Java 使用hibernate获取具有实体属性值的物理列值
我有一个表T,其中列的定义与往常一样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中的实际列
@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
属性,可以使用反射。还是我又误解你了?没错!反射是实现这一点的一种方法:)