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

How to restrict duplicacy when getting data from database in hibernate

我正在使用休眠从数据库中获取数据。我的数据库中有 3 个表,我为它们创建了 3 个实体 classes。我正在根据用户的职业和用户的城市这两个标准获取结果。

这是我的 DAO class

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

提前致谢

如果您不想调整查询,可以采用以下方法

覆盖用户对象中的 equals 和 hashcode,这样如果两个用户对象的 ID 相同,您就可以将其视为相同。

使用 Set 来保存您的数据。重复项将被丢弃。最后 return 集合或简单地将集合转换为列表

list.addAll(set)

除了 jozzy 的回答和评论之外,您还可以使用 TreeSet 而不是 HashSet,它是一个 SortedSet 实现,可以使您的用户记录保持排序。

所以它应该是这样的,

Set<User> foo = new TreeSet<User>(yourList);

您似乎正在选择地址 "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());