今天面试题有一道题说是用HQL删除表的重复记录,重复的只保留一条:想来想去HQL还真不知道怎么实现,现求高手帮忙。一个表 test  里面 3个字段: username,password,age  没有主键,不用管什么意思现在要求使用HQL语句删除表中的重复记录,到底怎么删除实在没见过这么高深的HQL语句

解决方案 »

  1.   

    先用distinct查询出无重复的记录List然后删除All records然后save list偶只想到了这个思路。
      

  2.   

    java做是不难 要求是HQL 应该还是一条语句
      

  3.   

    如果是用sql 倒是还可以结合一些方法实现如果用hql,我和上面想的也是这个思路,但是如果数据量太大那么就不实际了
    最主要的,题目是说  HQL  ,我都不知道怎么下手,难道是说写一个HQL语句完成反正我认为我的实力 直接用一个HQL语句实在无法实现。
      

  4.   


    没有主键?hibernate会把你所有的字段做为联合主键 再创建一个新的类!
      

  5.   

    我的意见是
    在程序中定义set集合实现自定义比较器  先查询出结果放入 然后再save
      

  6.   

    hibernate 好像必须要有主键吧。
      

  7.   

    笔试题没指明是hibernate  只写了 使用 HQL 语句
      

  8.   


    我说的就是HQL啊,没有主键,我怕是一条搞不定。
      

  9.   

    我查了下资料,SQL语句中distinct查询出的是无重复的记录,HQL中distinct是用来过滤重复的记录了把重复的记录全部删了
      

  10.   


    我也不知道HQL 是否必须要求有主键。
      

  11.   

    如果有   主键  则 怎么实现? 麻烦给出  HQL 语句 非常感谢
      

  12.   

    我试了一下,在mysql运行这条DELETE FROM person WHERE id NOT IN(SELECT MIN(temp.id) FROM (SELECT * FROM person) temp)sql语句是没有问题的,但是hibernate下报错,不知道啥情况package test;import java.util.List;import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;import dao.HibernateSessionFactory;
    import dao.Person;public class Test {
    public static void delete(){
    //删除person表中id大于最小id的那些记录
    //对应的sql语句是DELETE FROM person WHERE id NOT IN(SELECT MIN(temp.id) FROM (SELECT * FROM person) temp)
    String hql="DELETE FROM Person WHERE id NOT IN (SELECT MIN(temp.id) FROM (SELECT id FROM Person) temp)";
    Session session=null;
    Query query=null;
    Transaction ts=null;
    try{
    session=HibernateSessionFactory.getSession();
    ts=session.beginTransaction();
    query=session.createQuery(hql);
    query.executeUpdate();
    ts.commit();
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    if(session!=null){
    HibernateSessionFactory.closeSession();
    }
    }
    }
    public static void main(String[] args) {
    delete();
    }}
      

  13.   

    看清楚是HQL不是SQL!!神经病!