合并2个Hibernate SQL查询的列表

合并2个Hibernate SQL查询的列表,sql,list,hibernate,merge,Sql,List,Hibernate,Merge,我得到了两个带有多个连接的大型SQL查询,我试图将它们合并到一个列表中,并将其转换为DAO类,但没有成功。下面是一个简单的查询示例: String sql_comp = "select cs.identification as id from code_system"; Query q = session.createSQLQuery(sql_comp) .addScalar("id", StandardBasicTypes.LONG)

我得到了两个带有多个连接的大型SQL查询,我试图将它们合并到一个列表中,并将其转换为DAO类,但没有成功。下面是一个简单的查询示例:

String sql_comp = "select cs.identification as id from code_system"; 
Query q = session.createSQLQuery(sql_comp)
              .addScalar("id", StandardBasicTypes.LONG) 
              .setResultTransformer(Transformers.aliasToBean(FHIR_Parameters.class));
List list = q.list(); 

String sql_comp2 = "select vs.identification as id_2 from value_set"; 
Query q2 = session.createSQLQuery(sql_comp2)
              .addScalar("id_2", StandardBasicTypes.LONG) 
              .setResultTransformer(Transformers.aliasToBean(FHIR_Parameters.class));
List list_2 = q2.list(); 
我已经尝试过各种方法,并承诺通过以下方法获得最大成功:

List result = new ArrayList();
result.addAll(list);
result.addAll(list_2);
fhir_codesystem = (FHIR_Parameters) result.get(0);   
但是最后的演员阵容总是只包含第一个名单

有人知道我做错了什么吗?谢谢你

更新1:

好的,谢谢你,我意识到我的方法很愚蠢,我想合并元素,而不是列表。。。并使用getter/setter解决了该问题,如下所示:

FHIR_Parameters fhir_codesystem_2 = (FHIR_Parameters) list_2.get(0);
fhir_codesystem.setVs_Id(fhir_codesystem_2.getVs_Id());

我的问题仍然是,是否没有更好的解决办法?这样我就可以把新元素放在旧元素上,只填充空属性?

您实际上是在描述预期的行为。列表是有序的,所以通过先将列表添加到结果,列表中的项目将始终位于第一位。当您检查result.get0;-这将始终是您从列表中首先添加的第一项

您提到您想要一个合并列表,所以您应该从查询方法返回列表,而不是一个FHIR_参数实体

编辑响应编辑

LinkedHashmap会帮你解决这个问题,如果你需要的话,它会保持秩序。很抱歉,我在发布之前没有测试过,但这可能会有所帮助

final Map<Long, FHIR_Parameters> myMap = new LinkedHashMap<>();
for (FHIR_Parameters fhir1 : list) {
    myMap.put(fhir.getId(), fhir);
}
for (FHIR_Parameters fhir2 : list) {
    if (myMap.containsKey(fhir2.getId()) {
         final FHIR_Parameters fhir1 = myMap.get(fhir2.getId);
         //// do somthing to fhir1 (perhaps update from fhir2?)
    } else {
         // do something else, if you want to merge then:
         myMap.put(fhir2.getId(), fhir);
    }
}
final List<FHIR_Parameters> mergedList() = new ArrayList<>();
for (Long id : myMap.keySet()) {
    merged.add(myMap.get(id));
}

您确定2列表不是空的吗?list.size,list_2.size和result.size返回什么?是的,列表1的大小为21,列表2的大小为22。这真的取决于顺序。当我首先添加list时,它会解析list中的项目,当我首先添加list_2时,它会解析list中的项目。为什么:fhir_codesystem=fhir_Parameters result.get0??您需要的是列表而不是元素?因为result.get0只返回结果列表的第一个元素,所以您是对的,我走错了路,现在可以解决我的问题了。我在问自己是否有更好的解决方案,这样我就可以把新元素放在旧元素之上,并填充空属性。不用担心,我已经根据您的编辑更新了我的答案,我认为这符合您的需要。我刚刚注意到你已经解决了这个问题但希望它能有所帮助。