【问题标题】:Can we write describe table query in JPQL?我们可以在 JPQL 中编写描述表查询吗?
【发布时间】:2011-06-17 03:09:40
【问题描述】:

我正在从用户那里获取一个“关键字”和表名。 现在,我想查找数据类型为 varchar(String) 的表的所有列。 然后我将创建查询,它将关键字与那些列进行比较,匹配的行将作为结果集返回。

我试过desc table_name查询,但没用。

我们可以在 JPQL 中编写描述表查询吗? 如果没有,那么还有其他方法可以解决上述情况吗? 请帮助并提前感谢您。

【问题讨论】:

    标签: java spring jpa spring-mvc jpql


    【解决方案1】:

    不需要解决方法,因为这不是技术的缺点。需要更改的不是 JPQL,而是您选择的技术。在 JPQL 中,您甚至无法从表中选择 数据。您从类中进行选择,这些可以一次映射到多个表,从而为最简单的查询生成 SQL 连接。描述这样的连接是没有意义的。即使您可以描述一个表,您也不会使用 JPQL 中的列名,而是使用对象的属性。在 JPQL 中描述表是没有意义的。

    JPQL 用于查询对象,而不是表。此外,它适用于静态工作(其中类被映射到关系一次且永久有效),而不适用于动态工作,例如动态地将表映射到对象或实时检查数据库(这就是 ror 的 AR 的用途)。属性的动态发现不是其中的一部分。

    根据您真正想要实现的目标(我们只知道您想要做什么,这是不同的),您有两个基本选择:

    • 如果您尝试以动态方式编写软件,以便它根据架构的变化进行自我调整 - 删除 JPQL(或任何其他 ORM)。 Java 类是静态的,您不能真正将它们映射到动态表(或增长新属性)。使用行集,它们工作得很好,它们会让你使用 SQL;

    • 如果您正在构建一个可以由许多项目共享的智能库,因此必须使用许多不同的静态映射,请使用反射 API 来查找您查询的对象的属性。无论如何,表中列的名称对您没有帮助,因为在 JPQL 查询中您必须使用映射中定义的名称。

    【讨论】:

      【解决方案2】:

      映射数据库字典表并从中读取所需的数据。对于 Oracle 数据库,您需要从以下三个表中进行选择:user_tab_cmets、user_tab_cols、user_col_cmets;实现 describe 语句的全部功能。

      社区中有一些关于 JPA 未来版本中持久单元的动态定义的讨论:http://www.oracle.com/goto/newsletters/javadev/0111/blogs_sun_devoxx.html?msgid=3-3156674507

      【讨论】:

        【解决方案3】:

        据我所知,我们不能在 jpql 中使用 describe 查询。

        【讨论】:

          猜你喜欢
          • 2021-04-20
          • 2016-02-29
          • 1970-01-01
          • 1970-01-01
          • 2019-08-01
          • 2020-09-18
          • 2011-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多