【问题标题】:JPA query from java Object来自 java 对象的 JPA 查询
【发布时间】:2019-07-21 15:16:57
【问题描述】:

如何使用 jpa 查询对象(不是实体)?

例如这个简单的代码:

String [] theList = {a,b,c,d}. 
Query q = new Query("Select tl from theList tl")

背后的原因:查询是动态创建和执行的,但是 jpql 查询的 from 子句中的对象不一定是映射表。在某些情况下只有一个对象,所以实际需要的行为是在程序执行期间修改查询以满足条件,但我不知道如何修改查询。

编辑:由于代码的可移植性,我不使用本机查询。这将是最后的选择。

【问题讨论】:

  • 为什么不是原生查询?
  • 感谢您的建议。我已经编辑了问题。原因是该项目背后有几个 dbms(Oracle、Sybase、SqlServer 和 Postgres),并且有超过 10000 个查询,需要维护数据库特定的这么多,建议 +1。
  • 抱歉,您能否提供更多详细信息?我不明白您的问题,您的意思是什么但是 jpql 查询的 from 子句中的对象不一定是映射表我>
  • 您的意思是在内存中查询,或在数据库中查询(在这种情况下,您不是在查询“对象”)?
  • @YCF_L 字面意思是表达式。查询的from子句的对象在某些情况下不是映射表,而是java对象。

标签: java sql jpa eclipselink jpql


【解决方案1】:

您要查找的内容称为 LINQ,不幸的是 (?) 它仅在 C# 中可用。

但是,您可以使用 Stream(s) 部分模拟它。
Stream 基本上提供了您需要的所有运算符

.filter()               where
.max()                  max
.sorted()               orderby
.limit()                limit
.skip()                 offset
.collect(groupingBy())  group by

等等。只需看一下 Javadoc!

【讨论】:

  • 我会看看,+1 的建议。实际上我正在阅读有关 eclipselink 表达式的信息,但我不确定如何去做。
  • @CesarLeonardoOchoaContreras 但请稍等。该示例显示了您正在操作的阵列。 Eclipselink 表达式用于数据库访问。
  • 哦,是的。这是因为我正在处理不同级别的子查询(请记住,jpa 不支持 FROM 子句中的子查询,所以我首先提取并执行对对象的子查询,然后我的目的是查询这些对象。跨度>
  • @CesarLeonardoOchoaContreras 好吧,一旦您从 JPA 获得第一个结果集,如果您不需要最新数据(可能由数据库中的其他用户更新),您可以通过 Streams 进行操作。
【解决方案2】:

我认为“JdbcTemplate”可以满足您的要求。

JdbcTemplate 让您可以灵活地运行本机查询并将它们映射到 Java 类。

但是,您必须将 Java 类显式映射到数据库中的列名。

【讨论】:

    【解决方案3】:

    我已经使用joSQL 解决了。是一个强大的开源工具,允许您使用“sql”查询 java 对象。它不是 jpa,但满足了我的需求。 我见过的另一个工具叫做querydsl。

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-26
      相关资源
      最近更新 更多