我正在从用户那里获取'关键字'和表格名称。 现在,我想找到数据类型为varchar(String)的表的所有列。 然后我将创建查询,将关键字与那些列进行比较,匹配的行将作为结果集返回。
我尝试了desc table_name
查询,但它没有用。
我们可以在JPQL中编写描述表查询吗? 如果没有,那么还有其他方法可以解决上述情况吗? 请提前帮助并表示感谢。
答案 0 :(得分:4)
不需要解决方法,因为这不是该技术的缺点。它不是需要改变的JPQL,而是您选择的技术。在JPQL中,您甚至无法从表中选择数据。您可以从类中进行选择,这些类可以一次映射到多个表,从而为最简单的查询生成SQL连接。描述这样的连接将毫无意义。即使您可以描述一个表,也不要在JPQL中使用列的名称,而是使用对象的属性。在JPQL中描述表是没有意义的。
JPQL用于查询对象,而不是表。此外,它适用于静态工作(其中类被一次性地映射到关系),而不是用于动态的事情,例如将表映射到动态的对象或数据库的实时检查(这是ror的AR用于)。动态发现属性不是其中的一部分。
根据您真正想要实现的目标(我们只知道您要做什么,这是不同的),您有两个基本选择:
如果您尝试以动态方式编写一个软件,那么它会根据架构中的更改进行调整 - 删除JPQL(或任何其他ORM)。 Java类是静态的,您无法将它们真正映射到动态表(或增长新属性)。使用行集,它们工作正常,它们将允许您使用SQL;
如果要构建一个可以被许多项目共享的聪明库,并且必须使用许多不同的静态映射,请使用反射API查找您查询的对象的属性。无论如何,表中列的名称都无济于事,因为在JPQL查询中,您必须使用映射中定义的名称。
答案 1 :(得分:1)
映射数据库字典表并从中读取所需的数据。对于Oracle数据库,您需要从以下三个表中进行选择:user_tab_comments,user_tab_cols,user_col_comments;实现describe语句的全部功能。
在JPA的未来版本中,有一些关于社区关于持久性单元的动态定义的讨论:http://www.oracle.com/goto/newsletters/javadev/0111/blogs_sun_devoxx.html?msgid=3-3156674507
答案 2 :(得分:0)
据我说,我们不能在jpql中使用describe查询。