我使用hibernate从数据库中获取数据。我的数据库中有3个表,我为它们创建了3个实体类。我是根据用户和用户城市的两个标准专业来获取结果。
这是我的 DAO 类
@SuppressWarnings({ "unchecked", "null" })
public List<User> getUsersWithSameProfessionsById(long id) throws Exception {
session = sessionFactory.openSession();
String queryString = "SELECT DISTINCT a FROM Profession p1, Profession p2, Address a JOIN p2.user u WHERE p1.u_id=:id AND p2.profession=p1.profession AND a.uid=u.id";
Query query = session.createQuery(queryString);
query.setLong("id", id);
query.setMaxResults(10);
Set<User> foo = new HashSet<User>(query.list());
Set<User> foo1 = new HashSet<User>();
Query query1=null;
if(professionList.size()<10){
String queryString1 = "SELECT DISTINCT a FROM Address c1, Address c2, Address a JOIN c2.user u WHERE c1.uid=:id AND c2.city=c1.city AND a.uid=u.id";
query1 = session.createQuery(queryString1);
query1.setLong("id", id);
foo1.addAll(query1.list());
}
List<User> professionList3 = new ArrayList<User>();
Set<User> foo2 = new HashSet<User>();
foo2.addAll(foo);
foo2.addAll(foo1);
professionList3.addAll(foo2);
return professionList3;
}
这里我从专业的第一次查询中获取记录,但如果结果小于10,那么我在城市的基础上运行第二次查询。 但如果结果与两个标准匹配,那么我得到重复的结果,我不想要它..我想如果结果已经在第一个查询中出现,那么这些结果不会出现在第二个查询中。我是hql查询的新手,所以请帮助我。
提前完成
答案 0 :(得分:2)
如果您不想调整查询,可以采取以下方法
覆盖用户对象中的equals和hashcode,这样如果两个用户对象的id相同,就可以将它们视为相同。
使用Set来保存您的数据。重复项将被丢弃。最后返回集合或简单地将集合转换为列表
list.addAll(set)
答案 1 :(得分:1)
除了jozzy的答案和评论之外,您可以使用TreeSet而不是HashSet,这是一个SortedSet实现,并将保持您的用户记录排序。
所以应该这样,
Set<User> foo = new TreeSet<User>(yourList);
答案 2 :(得分:1)
似乎你在选择地址“SELECT DISTINCT a”..可能是你的意思“SELECT DISTINCT u”。 假设您正在选择用户,在完成第一个查询后,您可以在列表中收集userIds ..
List<Long> alreadyFoundUserIds = new ArrayList<>();
for(User user : foo){
alreadyFoundUserIds.add(user.getId());
}
然后在第二个查询中,您可以排除这些用户并获取剩余用户 (10 - foo.size())。
String queryString1 = "SELECT DISTINCT u FROM Address c1, Address c2, Address a JOIN c2.user u WHERE c1.uid=:id AND c2.city=c1.city AND a.uid=u.id
AND u.id NOT IN (:alreadyFoundUserIds ) ";
query1 = session.createQuery(queryString1);
query1.setLong("id", id);
query1.setParameterList("alreadyFoundUserIds ", alreadyFoundUserIds );
query1.setMaxResults(10 - alreadyFoundUserIds.size());