gpt4 book ai didi

java - 如何处理 JPQL 查询返回的对象类型?

转载 作者:搜寻专家 更新时间:2023-10-31 08:29:47 24 4
gpt4 key购买 nike

我可以使用仅从一个表返回数据的 JPQL 轻松做到这一点。

SELECT m1 FROM MasatosanTest m1

这意味着返回一种数据类型。所以我可以将查询结果存储到指定类型的列表中:

List<MasatosanTest> mt = query.getResultList();

代码片段

private static final String JPQL_TEST = "SELECT m1 FROM MasatosanTest m1;

@Path("innerJoin")
@GET
@Produces("application/json")
public List<MasatosanTest> getJoinedResult() {
System.out.println("getJoinedResult called");
EntityManager em = null;
List<MasatosanTest> mt = null;

try {
em = EmProvider.getDefaultManager();
Query query = em.createQuery(JPQL_TEST);
mt = query.getResultList();
}
catch(Exception e) {
System.out.println("MasatosanTestResource.java - getJoinedResult ERROR: " + e);
}
finally {
if(em != null) {
em.close();
}
}
return mt;
}

现在,如果我尝试涉及 2 个表的 JPQL....

查询

SELECT m1, m2 FROM Masatosan m1, Masatosan2 m2;

List<Masatosan> result = query.getResultList();

这不会立即导致错误,但实际上返回的是对象类型而不是特定类型,例如 MasatosanMasatosan2

所以当我迭代时,它会导致 CASTException,

for(Masatosan item : result) { .... }

处理这种情况的好方法是什么?

更新

如果我系统打印变量“result”,它会吐出:

return object ==========>
[[Ljava.lang.Object;@1540f1e, [Ljava.lang.Object;@1ac7e54, [Ljava.lang.Object;@199cd0a,
[Ljava.lang.Object;@6487d7, [Ljava.lang.Object;@125755, [Ljava.lang.Object;@239ff3,
[Ljava.lang.Object;@da2335, [Ljava.lang.Object;@13da77b, [Ljava.lang.Object;@bea4e1,
[Ljava.lang.Object;@3add4b, [Ljava.lang.Object;@968e06, [Ljava.lang.Object;@4642c8,
[Ljava.lang.Object;@ca81a4, [Ljava.lang.Object;@105510f, [Ljava.lang.Object;@cde78,
[Ljava.lang.Object;@e1b60e, [Ljava.lang.Object;@776306, [Ljava.lang.Object;@6275c,
[Ljava.lang.Object;@21035, [Ljava.lang.Object;@1762346, [Ljava.lang.Object;@105ea3d,
[Ljava.lang.Object;@15564f6, [Ljava.lang.Object;@1577817, [Ljava.lang.Object;@18d30be,
[Ljava.lang.Object;@7b235c, [Ljava.lang.Object;@4e83d4, [Ljava.lang.Object;@b0f862]

首先,我以为我在数组中,但第一个中的 [ 括号似乎只是字符串的一部分???

测试:

 for(Object items : result) {
System.out.println("-------------------" + items);
System.out.println(items.toString());
return null;
}

这将输出:

 -------------------[Ljava.lang.Object;@c723e8
[Ljava.lang.Object;@c723e8

所以“L”旁边的方括号不代表数组。

这意味着查询结果实际上存储在List<Object>中它由两种类型的对象组成(即 M asatosan ObjectMasatotan2 对象)

还有 ClassCastException :( 我很困惑,它应该是可转换的)

 int count = 0;
for(Object items : mt) {
System.out.println("-------------- " + count + " --------------" + items);
count ++;
Masatosan woot = (Masatosan) items;
System.out.println(woot.getUsername());
}

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to local.test.entity.Masatosan

最佳答案

这可能会返回一个 List<Object[]> . ClassCastException的消息将具有确切的类型。如果我是对的:

for (Object[] items : result) {
Masatosan m1 = (Masatosan) items[0];
Masatosan m2 = (Masatosan) items[1];
}

引用the docs

When multiple select_expressions are used in the SELECT clause, the result of the query is of type Object[], and the elements in this result correspond in order to the order of their specification in the SELECT clause

关于java - 如何处理 JPQL 查询返回的对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4507686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com