使用Hibernate将结果集中具有相同id的行分配到Java列表中

3

我正在使用Hibernate从数据库中检索一些数据。 我正在使用的SQL查询返回的结果集如下:

SourceId | TargetId
1        | 10
1        | 11
1        | 12
2        | 13
2        | 14

现在我有一个类似于以下的类:

@NamedNativeQuery(name = "myQuery", resultSetMapping = "myMapping", 
    query = "select source.id id1, target.id id2
            + "from someTable source "
            + "left join associationTable association on source.id=association.sourceId "
            + "left join someTable target on association.targetId=target.id "
            + "where source.id in(?1)")

@SqlResultSetMapping(name = "myMapping", 
            entities = @EntityResult(entityClass = DBCalculationElement.class, fields = {
    @FieldResult(name = "targetId", column = "targetId"),
    @FieldResult(name = "sourceId", column = "sourceId") }))

public class MyClass {

    private String sourceId;
    private String targetId;

        public String getSourceId() {
            return sourceId;
        }

        public String getTargetId() {
            return targetId;
        }
}

尽管一切都正常工作,我得到了需要的结果,但在某些情况下,结果集非常庞大(数千行),因此实际获取数据需要几分钟。我知道在处理真正大的结果集时,Hibernate在性能方面并不是最佳解决方案,但我试图避免使用原始JDBC。

一个解决方法是将targetId作为字符串列表。这样,使用上面的resultSet作为示例,我将获得2个对象,其中一个是

sourceId = "1" 

这里还有一个包含以下内容的targetIds列表:

targetId = <"10", "11", "12">

对于sourceId =“2”的第二个对象,可以采用类似的方式。

有没有人知道如何使用Hibernate实现这一点?如何在Java中将多行映射到列表?

2个回答

3

曾经,我通过编写存储过程来解决这个问题。 您可以编写存储过程来返回每个源ID的目标ID的逗号分隔值,并在主查询中使用distinct获取唯一的源ID。

希望对您也有用。


好的,我无法修改数据库中的任何内容,包括创建存储过程。但是这个逗号分隔文本的解决方案会起作用 :) 我只需要修改我的查询以获取所有sourceId作为逗号分隔的字符串 :) 感谢您的想法! - Alex Ntousias

0
首先,Hibernate在处理大数据集时性能可能不是最佳解决方案这一说法是不准确的。
有些情况下查询结果集非常庞大(数千行)...
但是对于像PostgreSQL、MySQL等数据库管理系统来说,这并不算很大。
你应该考虑使用"setMaxResults"和"setFirstResult"对查询进行分页(类似于"offset"和"limit")。
此外,你还应该检查机器和JVM的配置,如果你在处理如此简单的查询(虽然包含了join,但仍然很简单)时存在性能问题,就需要进行优化。

嗨,bluefoot,感谢您的回复。嗯,我上面描述的问题是实际问题的过于简化的表述...我只包含了与我想要做的事情相关的所有信息。实际上,查询涉及许多连接和多个条件。对此我没有进行阐明,抱歉。尽管如此,当我直接在数据库中运行查询时,可以在不到1秒的时间内获得结果,而在Hibernate中我必须等待至少8分钟。 设置最大结果数的解决方案是不可行的,因为我需要所有结果以便可以在程序中操作它们。 - Alex Ntousias
现在我们有一个问题 :) 你能发布你的Hibernate版本和Hibernate配置文件吗? - bluefoot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接