在休眠中从数据库获取数据时如何限制重复
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());
我正在使用休眠从数据库中获取数据。我的数据库中有 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());