Java 如何获取Hibernate返回的值?

Java 如何获取Hibernate返回的值?,java,mysql,hibernate,Java,Mysql,Hibernate,我被卡住了,我用hibernate运行这个查询,但不知道如何获取查询返回的值 查询: select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3; public Set<Magistrado> get3Magistrado() { ConnectionDataBase c

我被卡住了,我用hibernate运行这个查询,但不知道如何获取查询返回的值

查询:

select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3;
public Set<Magistrado> get3Magistrado() {
        ConnectionDataBase cdb = new ConnectionDataBase();
        Set<Magistrado> magistrados = null;

        try {
            Query createQuery = cdb.getSession().createQuery("select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3");
            // Here, HELP!
            if (magistrados == null) {
                return null;
            }
        }
        catch (HibernateException he) {
            cdb.catchException(he);
        }
        finally {
            cdb.closeSession();
        }

        return magistrados;
    }
public class Subject  implements java.io.Serializable {


     private Integer id;
     private String subName;
     private String day;
     private String time;
     private Set<Student> students = new HashSet<>();
     ...
public class Student  implements java.io.Serializable {


     private Integer id;
     private String FName;
     private String LName;
     private int age;
     private Set subjects = new HashSet();
     ...
Query q = s.createQuery("FROM com.hibernate.entities.Subject sub JOIN sub.students s WHERE s.id= :stu_id")
                .setInteger("stu_id", 1);
       List<String> subj = q.list();
    for (String ss : subj) {
        System.out.println(ss);
    }
DAO:

select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3;
public Set<Magistrado> get3Magistrado() {
        ConnectionDataBase cdb = new ConnectionDataBase();
        Set<Magistrado> magistrados = null;

        try {
            Query createQuery = cdb.getSession().createQuery("select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3");
            // Here, HELP!
            if (magistrados == null) {
                return null;
            }
        }
        catch (HibernateException he) {
            cdb.catchException(he);
        }
        finally {
            cdb.closeSession();
        }

        return magistrados;
    }
public class Subject  implements java.io.Serializable {


     private Integer id;
     private String subName;
     private String day;
     private String time;
     private Set<Student> students = new HashSet<>();
     ...
public class Student  implements java.io.Serializable {


     private Integer id;
     private String FName;
     private String LName;
     private int age;
     private Set subjects = new HashSet();
     ...
Query q = s.createQuery("FROM com.hibernate.entities.Subject sub JOIN sub.students s WHERE s.id= :stu_id")
                .setInteger("stu_id", 1);
       List<String> subj = q.list();
    for (String ss : subj) {
        System.out.println(ss);
    }

查询对象没有方法让我知道idMagistradonumeroDemandas的值。我不知道该怎么办,帮助。

HQL是一种面向对象的查询语言,类似于SQL,但HQL不操作表和列,而是使用持久对象及其属性

假设我们有一个如下所示的数据库表结构:

然后可以给出每个表的实体类(Hibernate将Java类映射到数据库表):

主题

public class Subject  implements java.io.Serializable {


 private Integer id;
 private String subName;
 private String day;
 private String time;
 private Set subjectHasStuDetailses = new HashSet();


public Subject() {
}
//getters and setters
...
学习细节

public class StuDetails  implements java.io.Serializable {


     private Integer id;
     private String FName;
     private String LName;
     private String sex;
     private String dob;
     private Set subjectHasStuDetailses = new HashSet();

    public StuDetails() {
    }
    //getters and setters
    ...
public class SubjectHasStuDetails  implements java.io.Serializable {


     private Integer id;
     private StuDetails stuDetails;
     private Subject subject;

    public SubjectHasStuDetails() {
    }
    //getters and setters
    ...
主题的详细信息

public class StuDetails  implements java.io.Serializable {


     private Integer id;
     private String FName;
     private String LName;
     private String sex;
     private String dob;
     private Set subjectHasStuDetailses = new HashSet();

    public StuDetails() {
    }
    //getters and setters
    ...
public class SubjectHasStuDetails  implements java.io.Serializable {


     private Integer id;
     private StuDetails stuDetails;
     private Subject subject;

    public SubjectHasStuDetails() {
    }
    //getters and setters
    ...
在每个实体类中,我们都可以根据需要重写默认构造函数

假设我们的实体类位于名为com.hibernate.entities的包中。如果我们需要让选定的学生完成所有科目,那么我们的Hql查询可以是:

Query query = ss.createQuery("FROM com.hibernate.entities.SubjectHasStuDetails shs WHERE "
                + "shs.stuDetails.id= :s_id").
                setInteger("s_id", 32);
 List<com.hibernate.entities.SubjectHasStuDetails> shs = query.list();
    for (SubjectHasStuDetails sh : shs) {
       sh.getSubject().getSubName();
    }
更新:

select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3;
public Set<Magistrado> get3Magistrado() {
        ConnectionDataBase cdb = new ConnectionDataBase();
        Set<Magistrado> magistrados = null;

        try {
            Query createQuery = cdb.getSession().createQuery("select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3");
            // Here, HELP!
            if (magistrados == null) {
                return null;
            }
        }
        catch (HibernateException he) {
            cdb.catchException(he);
        }
        finally {
            cdb.closeSession();
        }

        return magistrados;
    }
public class Subject  implements java.io.Serializable {


     private Integer id;
     private String subName;
     private String day;
     private String time;
     private Set<Student> students = new HashSet<>();
     ...
public class Student  implements java.io.Serializable {


     private Integer id;
     private String FName;
     private String LName;
     private int age;
     private Set subjects = new HashSet();
     ...
Query q = s.createQuery("FROM com.hibernate.entities.Subject sub JOIN sub.students s WHERE s.id= :stu_id")
                .setInteger("stu_id", 1);
       List<String> subj = q.list();
    for (String ss : subj) {
        System.out.println(ss);
    }
如果您使用的是已识别的关系:

mysql> select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3;
+--------------+----------------+
| idMagistrado | numeroDemandas |
+--------------+----------------+
|            3 |              1 |
|            2 |              2 |
|            1 |              3 |
+--------------+----------------+
3 rows in set (0.00 sec)
主题:

select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3;
public Set<Magistrado> get3Magistrado() {
        ConnectionDataBase cdb = new ConnectionDataBase();
        Set<Magistrado> magistrados = null;

        try {
            Query createQuery = cdb.getSession().createQuery("select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3");
            // Here, HELP!
            if (magistrados == null) {
                return null;
            }
        }
        catch (HibernateException he) {
            cdb.catchException(he);
        }
        finally {
            cdb.closeSession();
        }

        return magistrados;
    }
public class Subject  implements java.io.Serializable {


     private Integer id;
     private String subName;
     private String day;
     private String time;
     private Set<Student> students = new HashSet<>();
     ...
public class Student  implements java.io.Serializable {


     private Integer id;
     private String FName;
     private String LName;
     private int age;
     private Set subjects = new HashSet();
     ...
Query q = s.createQuery("FROM com.hibernate.entities.Subject sub JOIN sub.students s WHERE s.id= :stu_id")
                .setInteger("stu_id", 1);
       List<String> subj = q.list();
    for (String ss : subj) {
        System.out.println(ss);
    }
查询:

select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3;
public Set<Magistrado> get3Magistrado() {
        ConnectionDataBase cdb = new ConnectionDataBase();
        Set<Magistrado> magistrados = null;

        try {
            Query createQuery = cdb.getSession().createQuery("select idMagistrado, count(*) as numeroDemandas from demandamagistrado group by idMagistrado order by numeroDemandas asc limit 3");
            // Here, HELP!
            if (magistrados == null) {
                return null;
            }
        }
        catch (HibernateException he) {
            cdb.catchException(he);
        }
        finally {
            cdb.closeSession();
        }

        return magistrados;
    }
public class Subject  implements java.io.Serializable {


     private Integer id;
     private String subName;
     private String day;
     private String time;
     private Set<Student> students = new HashSet<>();
     ...
public class Student  implements java.io.Serializable {


     private Integer id;
     private String FName;
     private String LName;
     private int age;
     private Set subjects = new HashSet();
     ...
Query q = s.createQuery("FROM com.hibernate.entities.Subject sub JOIN sub.students s WHERE s.id= :stu_id")
                .setInteger("stu_id", 1);
       List<String> subj = q.list();
    for (String ss : subj) {
        System.out.println(ss);
    }
Query q=s.createQuery(“FROM com.hibernate.entities.Subject sub JOIN sub.s,其中s.id=:stu_id”)
.setInteger(“stu_id”,1);
List SUB=q.List();
for(字符串ss:subc){
系统输出打印LN(ss);
}
我想你应该知道“HQL”不同于“SQL”; 当您使用HQL时,应该从类(而不是表)进行查询

因此,如果希望执行sql并在hibernate中获得结果:

String sql = "select idMagistrado, count(*) as numeroDemandas from demandamagistrado         
group by idMagistrado order by numeroDemandas asc limit 3";
您应该以以下方式使用方法createSQLQuery(而不是createQuery):

 List<Object[]> objList = cdb.getSession().createSQLQuery(sql).list();
 for(Object[] objs : objList){
    int idMagistrado = Integer.valueOf(objs[0]);
    int numeroDemandas = Integer.valuesOf(objs[1]);
    System.out.println(idMagistrado + ":" + numeroDemandas);
 }
List objList=cdb.getSession().createSQLQuery(sql.List();
对于(对象[]objs:objList){
int idMagistrado=Integer.valueOf(objs[0]);
int numeroDemandas=Integer.valuesOf(objs[1]);
System.out.println(idMagistrado+“:”+numeriodemandas);
}

您刚刚创建了查询。添加
magistrados=createQuery.list()注释行中的代码我理解,但问题是,在您的示例中,您使用的是“非标识”关系,在我的示例中,我使用的是“标识关系”,因此第三个表“SubjectHastudeTails”不存在。我的查询是“特殊的”“。方法createSQLQuery用于SQL,createQuery用于HQL;是的,这就是我要找的。非常感谢你3.