当前位置: 首页 > 知识库问答 >
问题:

JPA:使用access/SQL-JPA这样的结果集进行动态查询?

赫连子石
2023-03-14

预备:代码存在于使用JPA的JavaWebApp中,并对其感到满意,因此完全脱离JPA并不是解决方案。

但我的部分是关于动态数据查询的。比如说,管理员可以编写sql查询,用户可以通过这些查询生成csv导出。

有了JDBC,我获得了很多关于ResultSet的元数据,我可以在我知道的地方获取字符串和整数。

JPA允许直接SQL查询,但我只能用getResultList()作为List获取这些

我知道JPA一般不能提供ResultSet或JDBCConnection,因为它可以访问文本、大数据或memcache而不是SQL。但我还没有找到类似SQL-JPA的东西。

在JPA-Application中使用Eclipse Link的直接和特定方法是错误的,也是非常肮脏的。我可以肯定,应用程序将留在SQL,但不是说它将留在Eclipse Link。

因此,似乎我必须自己编写一个结果集,使用诸如columncount和列名称之类的元数据,并且我无法从数据库结果中读取列的数据类型。但是,除了JPA之外,编写一个ResultSet类来记忆SQL字符串中的一部分信息,感觉也是错误的。

在JPA-Application中打开一个额外的JDBC-Connection似乎可以解决这个问题,但是我甚至不能从JPA中获取连接数据,两个独立的配置迟早会导致厄运。

是我的用例太奇怪还是JPA太有限还是我对正确的解决方案视而不见?

SQL对于复杂的数据关系来说是一种非常强大和简单的语言,所以我想知道为什么JPA如此害怕它(当然,大量典型的对象写入和对象读取对于jdbc来说太痛苦了)。

是否有人知道JPA现有的ResultSet实现,或者是否有我看不到的正确解决方案?

谢谢你的帮助。


共有2个答案

寿高阳
2023-03-14

如果我理解正确,那么您需要的是一个本机SQL查询(可以与JPA一起使用),然后将结果放入某种数据结构中进行操作,但无需事先将其映射到实体中,对吗?

然后查询语言结果映射器(QLRM)项目可能对您有用,因为它允许您从本机查询创建结果对象,唯一的要求是参数的数量和类型相同:

Query q = em.createNativeQuery("SELECT ID, NAME FROM EMPLOYEE");
List<EmployeeTO> list = jpaResultMapper.list(q, EmployeeTO.class);

如果你真的不知道结果是什么,因为它们是通用的,那么除了使用普通的JDBC和检查元数据之外,你没有太多的选择。

但请记住,让用户建立自己的通用查询可能会有危险,因为可能会发生SQL注入之类的事情。最好尝试定义一些可能的构建块(使用准备好的语句和绑定变量,而不是字符串连接的SQL),您可以单独测试这些构建块,并让用户从中进行选择。

逄嘉木
2023-03-14

因为我只看到了一些评论,所以我将尝试提供一个答案,但由于这个问题没有一个非常具体的编程问题,我的答案将是相似的。

JPA是一个ORM,这意味着它将数据库映射到Java对象,并提供了更多的功能(事务,将EntityManager操作转换为SQL查询,命名查询,...)。因为根据定义,ORM是JDBC之上的一个层,所以它没有您需要的目的。

你是对的:

>

Connection conn=em.unwrap(Session.class)。连接()

您应该在JPA事务中以这种方式访问连接。否则,您将负责释放连接。(引自此处)

或者使用常规的JPQL查询来检索所有需要的数据,然后您将直接获得正确的类型。这里的限制是:它没有SQL那么灵活,但是远(例如,您可以从JPA2.1使用JOIN ON)。

 类似资料:
  • 我正在浏览Quarkus当前可用的指南 我说的是在不使用现有JPA实体的情况下,将SQL查询结果绑定到自定义pojo的可能性。我找到的所有示例都只从一个表中提取记录,从中提取出相同JPA实体的实例列表。然而,这不太可能是现实世界应用程序的常见用例。大多数情况下,我们必须处理不那么琐碎的查询,这些查询涉及来自不同表的字段的混合、连接或计算字段。 SQL ResultSet映射是一个方便的JPA功能,

  • 我需要通过在Hibernate中执行本机查询获得结果集。虽然我使用的是EntityManager,但查询和结果集可能不是实体。 当我尝试下面的代码时,我得到了一个结果。因为我要求的是一个有值的结果。(Hibernate JPA) 结果是:爱丽丝 当我试图从相同的代码中获得多个select out(查询为select name)时,指定来自fresher_test(其中id=1) 这有一种方法,我可

  • 我正在为spring批处理使用java配置(spring boot)。我有一个员工Id列表,对于每个Id,我需要运行一个查询(如下所示),然后处理数据。 我知道我们可以使用阅读器。setPreparedStatementSetter动态设置上述SQL中的参数。但是,我不确定如何对列表中的每个员工id重复批处理过程。即使我将reader()标记为@StepScope,也只会调用一次reader。(即

  • 问题内容: 使用JPA 2.0的CriteriaBuilder构建动态查询时,我有些困惑。 我猜我有一个很常见的用例:用户提供了任意数量的搜索参数X进行连接和/或连接: Method或CriteriaBuilder不是动态的: 谓词或(谓词…限制) 有想法吗?样品? 问题答案: 在您的情况下,我宁愿避免不得不循环并动态地构建化合物: 您可能需要检查使用Criteria API和Metamodel

  • 我试图构建一个Spring Boot REST API,从MySQL DB中获取数据。这是我在Spring Boot REST API应用程序的存储库代码中定义的JPA查询方法: 这是我要查询的表的详细信息:

  • 假设我有一个生成的实体,如下所示: 我的输入值是字段名称(“可用性”、“生日”、“CVID”...)和一个字符串值,我应该使用它对所有字段执行“like”。 我想从以下字段名开始构建一个查询: null 我试图使用PathBuilder,但似乎要使用“getString或getBoolean”之类的方法,就必须知道要提取的字段的类型。在我的例子中,由于我只是从字段名开始,所以我不能使用这些方法,也