我有问题。首先让我向您展示我想要比较的bean的结构:
ItemDTO包含:
ItemOnCharacterDTO包含:
ItemDTO 从XML文件中静态读取。有成千上万的他们并没有改变(至少我不在乎他们现在这样做)。 通过查询数据库创建 ItemOnCharacterDTOs 。 ownerID,itemID,count和location因字符而异,因此保存在数据库中。此处的itemID对应于有效的ItemDTO。
我有一个ItemOnCharacterDTO对象的数组(或ArrayList),我想按多个标准排序,例如通过“itemOnCharacterDTO.ownerID”,“itemDTO.name”,“itemDTO.type”。
如果我将ItemDTO和ItemOnCharacterDTO组合到一个类(例如ItemAllDTO),我可以轻松使用apache BeanComparator。但是:我不是。 原因是:用户可以在不同的字符上有多个项目。基本项目数据(ItemDTO-数据)是相同的,而用户特定数据(ItemOnCharacterDTO-数据)是变化的。因此,我只加载前者一次,每次遇到不同的ItemOnCharacterDTO时加载用户特定的数据。
由于我在GWT中编写了所有内容,因此我决定对服务器进行排序,因为这是所有信息的位置(与前端相反,其中与项目相关的信息加载了分页)。我在服务器端使用Java。我编写了一个mapper来从项目相关的XML文件中正确检索静态XML数据。但基于字符的项目相关信息存储在mysql-database 。
中我希望能够通过ItemOnCharacterDTO-或ItemDTO-object 中存在的属性对ItemOnCharacterDTOs的数组或ArrayList进行排序(我有办法区分给定属性所属的DTO - 意思是:我知道如果用户按“count”排序,我将不得不检查此属性的ItemOnCharacterDTO-object而不是ItemDTO对象。
每个用户可能有几千个对象。每个ItemOnCharacterDTO都有大约5个属性,但每个ItemDTO大约有25个属性。因此,将它们组合成一个对象 - 即使只是为了进行比较 - 实际上并不是一个选项,因为它会非常慢并且耗费内存。
有人有更好的方法吗?我很高兴得到任何帮助 - 即使你只是提出一个原创的想法。我会解决的。
非常感谢您提前!非常感谢您的帮助!
伊戈尔。
P.s。:如果您还有其他问题,请随时询问 - 我会尽快回复! P.s.2:Java可能有类似“LINQ”的东西吗?也许它能帮我解决问题?
答案 0 :(得分:0)
创建两个哈希映射并保持密钥相同,而对象将来自不同的列表。这意味着您可以轻松访问它们并轻松匹配它们。
您还可以在两个对象中覆盖equals和hashcode方法。
然后你也可以将它们包装在一个对象中并用它进行排序。
答案 1 :(得分:0)
您可以实现自己的比较器,该比较器考虑来自两个类的数据。作为一个帮助结构,您可以保存2个映射,其中key是两个DTO的DTO ID。这样,您可以通过ID找到第二个DTO进行比较。
答案 2 :(得分:0)
我相信你已经做对了。通过BeanCompartor进行比较或您的自定义比较器应该能够通过导航对象层次结构来进行比较。所以,这是我相信的正确方法。
答案 3 :(得分:0)
当时(之前的Java 8 )我最终使用JoSQL,因为我最终想要以大多数(包括我自己)可以轻松理解的方式进行动态查询。它允许我以各种方式选择,比较,排序和限制我的结果集 - 正是我当时想做的事情。
现在有人可能会使用Java 8 lambda表达式作为我当时尝试做的事情(选择某些项目,比较,排序,限制结果集等)。我相信还有其他方法可以解释数据 - 特别是如果数据量很大,但当时没有必要,因为我处理的数据量不足以达到考虑重用一些数据库系统。
编辑:我与JoSQL无关,我只是用它来解决我的问题。