当前位置: 首页 > 面试题库 >

在Spring Data JPA中,有没有最简单的方法来获取表元数据(列名列表)信息?我可以在通用数据库上使用

高迪
2023-03-14
问题内容

我处于一种情况,我想使用spring数据jpa获取所有表的列列表,我的数据库很灵活,因此查询应该适用于所有类型的数据库。


问题答案:

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实体,或者并非所有表中的所有列都可以映射为实体字段。因此,直接查询数据库元数据可能会导致结果与实体类和字段不匹配。



 类似资料:
  • 问题内容: 我熟悉该界面,但是使用起来很笨拙。例如,为了找出表名,您必须使用众所周知的文字作为列名来调用并循环返回。 有没有更简单的方法来获取数据库元数据? 问题答案: 使用DdlUtils很容易做到:

  • 问题内容: 我想从数据库中的表中获取列名列表。使用编译指示,我会得到一个元组列表,其中包含很多不需要的信息。有没有办法只获取列名?所以我最终可能会遇到这样的事情: [Column1,Column2,Column3,Column4] 之所以绝对需要此列表,是因为我想在列表中搜索列名并获取索引,因为很多代码中都使用了索引。 有没有办法得到这样的清单? 谢谢 问题答案: 您可以使用sqlite3和pep

  • 问题内容: 如何获得特定表中的列名列表? IE。 火鸟表: 得到这样的列表: 问题答案: 如果要获取特定表中的列名列表,则这是您需要的sql查询: 我在firebird 2.5中尝试过此方法,并且可以正常工作。 顺便说一句,YOUR-TABLE-NAME周围的单引号是必需的

  • 问题内容: 如何使用查询获取SQL Server数据库中所有表的列表。我的意图是将其动态显示在网页上。 问题答案: 尝试: 这应该给您您想要的。然后,您需要从网页中调用它,以所需格式显示。 您可能要看: 如何使用C#在组合框中从数据库获取所有表的名称 可能会帮助您完成您想做的事情。 另外-您可能想看一下SQL Server:我应该在sys表上使用information_schema表吗? 用于sy

  • 这是我的控制器代码 {“cause”:{“cause”:null,“message”:“对于输入字符串:”newcustomer“},”message“:”未能从类型[java.lang.string]转换为类型[java.lang.integer]以表示值为“newcustomer”;嵌套异常是java.lang.NumberFormatException:对于输入字符串:“newcustome

  • 我正在用SpringBoot构建一个应用程序。我有一个存储库,我通过以下方式从方法名称创建查询: 这样的查询可以工作,方法调用的结果是具有该名称的用户。在Spring Boot中是否可以按名称创建查询,其中输入是名称列表,输出是用户列表,其中每个用户至少对应于列表中的一个名称?例如: 我也试过这样的方法,但是行不通。