在Java中执行Join操作,从数据库中检索一小组数据。 (上下文:Web应用程序)
在Web应用程序的上下文中,是否适合在Java中执行某些JOIN操作,从数据库检索的数据(从第一个查询),并使用“JOIN”ed数据进行第二次和最后一次查询到数据库以获取所需的数据。
Java是否为这样的实现提供了任何内置机制,或者最好的方法是什么?
(我知道,这不是最好的事情,但数据库不是SQL数据库,不允许JOIN操作。)
JOIN操作的数据是: – 一个数据集包含大约50个整数(avg),另一个包含大约150个整数(avg)。
第一个数据集将只有整数列表,但第二个数据集将包含一组整数和’数据整数’的列表。 如果两个数据集中的两个整数相交,则在结果列表中传递相应的“数据整数”。 因此结果将包含与相交的整数对应的数据整数。
例如,列表A = {21,65,93}列表B = {(21,42342),(53,73242),(93,32312)}
结果= {42342,32312}
用于JOIN操作的两组数据都可以以树结构的forms实现。 因此,这个JOIN操作可以更高效,因为只需要比较树而不是整个列表(在执行JOIN时,如果两个(类似深度)节点在树中的某个节点不匹配,那么它的所有子节点都将被跳过,控件将移动到下一个顶级节点)
谢谢。
当然,你可以在Java中快速加入JOIN。 我只知道反对这三个原因:
- 这是额外的工作
- 不匹配的行被不必要地获取
- 数据量可能太大而无法在内存中处理
无论如何,如果没有SQL DB,你别无选择。 因此,假设最简单的情况,即加入像Ax = Bx
这样的条件,您可以通过使用Set.retainAll
计算交集来Set.retainAll
。 对于交集的每个成员,您需要将第一个表中的所有相应行与第二个表中的所有相应行组合在一起。
假设表中没有更多有趣的列,那么就完成了。 否则你需要以某种方式附加它们。 如果x
在A
和B
中都是唯一的,您可以使用Maps,否则您需要一个Multiset(有很多实现可用,例如,在Guava中)。
用Java加入数据根本不是一个坏主意。 在某些情况下,它可能比在数据库中进行连接更快更合理(这取决于许多因素)。 特别是如果你别无选择:-)
如果您可以将数据库中的结果作为标准jdbc结果集获得,那么您可以使用智能行集系列:JoinRowSet,FilteredRowSet等。它们从数据库中收集表格数据,然后在Java端连接和过滤它们并将它们序列化(有点像ado.net)。 标准实现不是标准的一部分,但您可以在com.sun.rowset包中找到它们。
如果您只需要进行这种单一连接,它们可能是一种过度杀伤,但由于您使用的是某些nosql数据库,因此您可能希望标准化过滤和连接的方式。
您是否在询问如何在Java中进行集合交集? 鉴于您对数据的定义 – 两个数据集,完全是整数 – 这是我的建议:
设置a = new HashSet(第一个数据集中的元素列表)Set b = new HashSet(第二个数据集的元素列表)
Set joined = a.retainAll(b); //这是如何使用java.util.Set设置交集