如何在hibernate中从数据库获取数据时限制重复

时间:2015-08-19 08:27:28

标签: java mysql spring hibernate hql

我使用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查询的新手,所以请帮助我。

提前完成

3 个答案:

答案 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());