JPA规范包含metamodel
API,该API使您可以查询有关托管类型及其托管字段的信息。但是,它不涵盖基础数据库。因此,JPA中没有任何现成的查询数据库元数据。
每个RDBMS存储元信息的方式也不同,因此不可能有一个简单的,与数据库无关的解决方案。
但是,您可以通过几步来实现您想要的。
步骤1 :定义一个实体类,该实体类将保存元数据信息。
@Entity@IdClass(TablemetadataKey.class)@Table(name = "table_metadata")class Tablemetadata { @Column(name = "column_name") @Id String columnName; @Column(name = "table_name") @Id String tableName; public static class TablemetadataKey implements Serializable { String columnName; String tableName; }}步骤2 :为实体添加存储库。
public interface TablemetadataRepository extends JpaRepository<Tablemetadata, TablemetadataKey>{ Tablemetadata findByTableName(String tableName);}步骤3
:定义一个名为
table_metadata要映射到实体类的数据库视图。这必须使用特定于数据库的查询来定义(因为每个数据库都有不同的存储元数据的方式)。
可以在此步骤上执行特定于数据库的优化,例如与Oracle一起使用实例化视图以加快访问速度等。
或者,
table_metadata可以使用所需的列创建名为的表,并使用SQL脚本定期填充。
现在,应用程序可以完全访问所需的元数据。
List<Tablemetadata> metadata = tablemetadataRepository.findAll()Tablemetadata metadata = tablemetadataRepository.findByTableName("myTable");要注意的一个问题是,并非架构中的所有表都可以映射为JPA实体,或者并非所有表中的所有列都可以映射为实体字段。因此,直接查询数据库元数据可能会导致结果与实体类和字段不匹配。



