【问题标题】:Storing the keysets from a JPQL query result in a java list将 JPQL 查询结果中的键集存储在 java 列表中
【发布时间】:2020-08-16 06:45:00
【问题描述】:

我成功地执行了 jpql 查询并打印了存储在 queryResults 变量中的结果。我接下来要实现的是仅将 ID(主键列)存储在没有日期(值)的列表中,但我不太确定这是否可能;也许使用类似 java 地图的东西。可能吗?如果是,如何轻松实现?

  private static final TestDao Test_DAO = new TestDao();

 @Test
 public void testById() {
List<TestEntity> queryResults = TEST_DAO.findById(""); //The record from the sql query is stored in queryResults and findById("") is the method that executes the query in a TestDao class and it is called here

for (TestEntity qResult: queryResults) { // looping through the query result to print the rows
System.out.println(qResult.getId());
System.out.println(qResult.getDate());
}

System.out.println("This is the sql result " + queryResults );
       
}

Output:
This is the result [TestEntity(id=101, date=2020-01-19 15:12:32.447), TestEntity(id=102, date=2020-09-01 11:04:10.0)]// I want to get the IDs 101 and 102 and store in a list without the Dates

我试过这样使用map

Map&lt;Integer, Timestamp&gt; map= (Map&lt;Integer, Timestamp&gt;) queryResults.get(0); 但我遇到了异常:

java.lang.ClassCastException: TestEntity cannot be cast to java.util.Map

【问题讨论】:

  • 您已将您的 DAO 对象声明为静态 - 不知道为什么!方法名称是 - findById 但它显然返回一个列表。键在表中应该是唯一的。它接受一个空字符串作为参数!当然你得到一个例外。 queryResults.get(0) 返回一个 TestEntity 对象,您要求 Java 将其转换为 Map !
  • 我是根据最后一行的评论来回答的。其实我不是在回答,我是在帮你自己回答。您这样做是为了获取 id 并打印它: System.out.println(qResult.getId());所以你已经有了 id,每次迭代你都有一个 id。你不能把它添加到列表中吗???
  • queryResults 已经是键和值的列表,但我想要一个仅包含键的列表。请证明您认为它是如何实现的。如何仅将 ID 添加到列表中?谢谢
  • queryResults 已经是键和值的列表 - 这是不正确的。 queryResults 是一个 TestEntity 列表
  • List queryResults = TEST_DAO.findById("") 您正在获取一个 TestEntity 列表。然后你遍历列表以提取 Id 和 Date 并打印它。如果你能做到这一点,你能不将这些 id 添加到列表中并获取 Id 列表吗?

标签: java jpql


【解决方案1】:

实施前有几点。

  1. 为什么将 DAO 定义为静态?我认为这是一个糟糕的实现,除非我错过了您将其声明为静态的特定原因。您应该将其定义为成员变量而不是静态成员
  2. 方法的命名 - findById() 翻译成英文是 - find Something by this Id,但您正在获取记录列表,因此命名不正确。
  3. 如果 ID 属性不是表中的主键,则第 2 点无效,那么这是有道理的,但命名仍然不好。 Id 是我们用来在数据库中定义主键的东西,应该是并且将是唯一的。但是您的 cmets 建议 ID 是唯一的,并且是主键。因此,请了解数据库的工作原理
  4. 而且即使不是唯一的,如果你传递一个Id来查找一些记录,为什么会在Records中得到不同的id!!!

关于实施:

  1. 更改现有代码:
private TestDao Test_DAO = new TestDao();

@Test
public void testById() {
  List<TestEntity> queryResults = TEST_DAO.findById("");
  List<Long> listOfIds = new ArrayList<>(); // Assuming Id is Long type, same logic for any type
  for (TestEntity qResult: queryResults) {
    System.out.println(qResult.getId());
    listOfIds.add(qResult.getId());   // Just add it to the list
    System.out.println(qResult.getDate());
  }
       
}

如果您想提高查询效率: 你可以使用JPQLhibernate

然后您可以编写如下查询:

String query = "select te.id from TestEntity te";
// Create the TypedQuery using EntityManager and then get ResultSet back
List<Long> ids = query.getResultList();
  1. 在使用 Spring-Data-Jpa 的情况下,您可以定义存储库并定义方法并使用 @Query 注释传递查询。 Spring Data JPA

【讨论】:

  • 让我问这个。日期是一个时间戳。如果说我想在时间戳上增加 10 分钟,那么实现这一目标的最干净的方法是什么?如果您可以通过添加您的建议来更新您的答案,我们将不胜感激
  • 有不同的方法可以做到这一点,取决于您使用的数据类型。查看文档,这些都是直截了当的问题,我希望您熟悉这些文档以及如何使用它。 Java 8 Time Api
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2018-10-25
  • 2020-09-01
相关资源
最近更新 更多