【发布时间】:2014-08-22 20:43:04
【问题描述】:
初步:代码存在于使用 JPA 并且对它感到满意的 Java-Webapp 中,因此完全放弃 JPA 不是解决方案。
但我的部分是关于动态数据查询。例如,管理员可以编写 sql 查询,用户可以触发这些查询来生成 csv-exports。
使用 JDBC,我可以获得很多关于 ResultSet 的元数据,并且我可以在我知道的地方获取字符串和整数。
JPA 允许直接 SQL 查询,但我只能使用 getResultList() 作为 List<Object> 获取那些,这实际上是 List<Object[]> 或 List<Object>,具体取决于选择的列数(据我所知理解)并在将List<Object> 转换为List<Object[]> 时给出一些难看的警告。
我明白 JPA 通常不能提供 ResultSet 或 JDBCConnection,因为它可能是对文本或大数据或内存缓存而不是 SQL 的访问。但是我还没有找到类似 SQL-JPA 的东西。
在 JPA 应用程序中使用 EclipseLink 的直接和特定方法是错误且非常肮脏的。我可以确定应用程序将保留在 SQL 上,但不能确定它会保留在 EclipseLink 上。
所以看来我必须自己编写一个 ResultSet,其中包含列数和列名等元数据,并且我无法从数据库结果中读取列的数据类型。但是在 JPA 之外写一个 ResultSet 类来记忆 SQL-String 中的部分信息感觉也是不对的。
在 JPA-Application 中打开一个额外的 JDBC-Connection 似乎可以解决问题,但我什至没有从 JPA 中获取连接数据,而且两个单独的配置迟早会导致厄运。
是我的用例太奇怪还是 JPA 太有限或者我只是对正确的解决方案视而不见?
SQL是一种非常强大且简单的语言,用于复杂的数据关系,所以我想知道为什么 JPA 如此害怕它(当然,大量典型的 Object-Write 和 Object-Read用 jdbc 很痛苦)。
有谁知道 JPA 的现有 ResultSet-Implementation,或者有什么我看不到的正确解决方案?
感谢您的帮助。
【问题讨论】:
-
然后想象最终用户一起点击了一些值,这些值被程序转换为动态 SQL 查询。数据请求通常比“我有一个对象
person带有姓名、城市和生日”更灵活一些,所以我没有固定对象。我可以将结果的列定义为对象或类,但我看不出有办法在一个 JPA 请求中读取不同的对象 -
在您的应用程序中是否可以选择首先声明一个数据源并在您的 JPA 配置中使用该数据源(例如 jndi 数据源)?
-
@Serge,感谢您的提示。但是由于我在一个完整的应用程序中只有一个小角落,那会感觉很奇怪。我的印象是 JPA 应用程序中通常不涉及动态部分......但也许我在某些时候错了。如果我们要定义该 jdi 数据源,我们是否可以从 JPA 访问该数据源,还是必须将该数据源传递给整个程序?
-
如果您有一个数据源,您可以让 JPA 使用它(并且您的所有应用程序将继续使用 JPA)并让特殊部分在 JDBC 级别使用它。这实际上是一个常见的优化用例:大部分代码使用 JPA 等 ORM,一些瓶颈部分使用 JDBC。
-
所以 jdbc 连接是在“外部”JPA 处理的,不过也可以在 JPA 内部使用。我将与团队讨论,感谢您的提示。这意味着需要一个额外的通道来为我的类提供 JDBC 连接,而 JPA 只提供
JPA.em()。