Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:如何使用sql检索预定义对象?_Java_Sql_Hibernate - Fatal编程技术网

Java Hibernate:如何使用sql检索预定义对象?

Java Hibernate:如何使用sql检索预定义对象?,java,sql,hibernate,Java,Sql,Hibernate,我使用以下sql检索预定义对象 select idpatient, password from Patient where user_name= :username 这是我用来获取患者对象的方法 public Patient getUserNameAndPassword(String username, Session session) { Query query=session.createQuery("select idpatient, password from Pati

我使用以下sql检索预定义对象

select idpatient, password from Patient where user_name= :username
这是我用来获取患者对象的方法

public Patient getUserNameAndPassword(String username, Session session) {
        Query query=session.createQuery("select idpatient, password from Patient where user_name= :username");
        query.setParameter("username", username);
        List list = query.list();
        Patient patient=(Patient) list.get(0);
        return patient;
}
这是我的Patient对象-Patient.java

public class Patient implements java.io.Serializable {

    private Integer idpatient;
    private String firstName;
    private String lastName;
    private String email;
    private Date dob;
    private String parentEmail;
    private String gender;
    private String userName;
    private String password;

    /**
     * @return the idpatient
     */
    public Integer getIdpatient() {
        return idpatient;
    }

    /**
     * @param idpatient the idpatient to set
     */
    public void setIdpatient(Integer idpatient) {
        this.idpatient = idpatient;
    }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the dob
     */
    public Date getDob() {
        return dob;
    }

    /**
     * @param dob the dob to set
     */
    public void setDob(Date dob) {
        this.dob = dob;
    }

    /**
     * @return the parentEmail
     */
    public String getParentEmail() {
        return parentEmail;
    }

    /**
     * @param parentEmail the parentEmail to set
     */
    public void setParentEmail(String parentEmail) {
        this.parentEmail = parentEmail;
    }

    /**
     * @return the gender
     */
    public String getGender() {
        return gender;
    }

    /**
     * @param gender the gender to set
     */
    public void setGender(String gender) {
        this.gender = gender;
    }

    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }

    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

}
当我在getUserName和Password方法上方运行时,会生成以下异常

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to beans.Patient
我怎样才能正确地做到这一点?有什么想法吗?

试试这个

Query query= session.createQuery("SELECT NEW beans.Patient( idpatient, password) FROM Patient WHERE user_name= :username");
query.setParameter("username", username);
List<Patient> patients = query.list();
Query Query=session.createQuery(“从患者中选择新bean.Patient(idpatient,password),其中user_name=:username”);
query.setParameter(“用户名”,用户名);
List patients=query.List();
这看起来像是一个hibernate实现的构造函数表达式。

试试这个

Query query= session.createQuery("SELECT NEW beans.Patient( idpatient, password) FROM Patient WHERE user_name= :username");
query.setParameter("username", username);
List<Patient> patients = query.list();
Query Query=session.createQuery(“从患者中选择新bean.Patient(idpatient,password),其中user_name=:username”);
query.setParameter(“用户名”,用户名);
List patients=query.List();

这看起来像是一个hibernate实现的构造函数表达式。

您得到的是java.lang.ClassCastException,因为您正在检索只有两个属性的patient对象,即idpatient,password。但是,Patient类中缺少用于创建此对象的构造函数

Query query=session.createQuery("select idpatient, password from Patient where user_name= :username");
下面的查询检索具有Patient类的两个属性(idpatient,password)的Patient对象

Query query=session.createQuery("select idpatient, password from Patient where user_name= :username");
您需要使用idpatient,password字段在Patient类中创建参数化构造函数

public Patient(Integer idpatient,String password ){
 this.idpatient=idpatient;
 this.password =password ;
}
现在,您可以使用两个字段检索Patient对象


注意:如果您使用默认构造函数创建对象,还需要创建默认的Patient类构造函数以及参数化构造函数。

您得到的是java.lang.ClassCastException,因为您检索的Patient对象只有两个属性,即idpatient,password。但是,Patient类中缺少用于创建此对象的构造函数

Query query=session.createQuery("select idpatient, password from Patient where user_name= :username");
下面的查询检索具有Patient类的两个属性(idpatient,password)的Patient对象

Query query=session.createQuery("select idpatient, password from Patient where user_name= :username");
您需要使用idpatient,password字段在Patient类中创建参数化构造函数

public Patient(Integer idpatient,String password ){
 this.idpatient=idpatient;
 this.password =password ;
}
现在,您可以使用两个字段检索Patient对象


注意:如果使用默认构造函数创建对象,则还需要创建默认的患者类构造函数以及参数化的构造函数。

如果患者类是非托管实体,则可以使用

session.createSQLQuery("SELECT idpatient, password FROM Patient WHERE username=:user_name")
    .setParameter("user_name",username)
    .setResultTransformer(Transformers.aliasToBean(Patient.class))
详细文件如下:

对于托管实体,可以在Select查询中使用NEW关键字

List<Patient> patients = session.createQuery("SELECT NEW beans.Patient( idpatient, password) FROM Patient WHERE username='" + username + "'").list();
List patients=session.createQuery(“从患者中选择新bean.Patient(idpatient,密码),其中username='”+username+“”)”).List();
请注意,您必须首先定义构造函数


此处的详细文档:

如果患者类是非托管实体,则可以使用

session.createSQLQuery("SELECT idpatient, password FROM Patient WHERE username=:user_name")
    .setParameter("user_name",username)
    .setResultTransformer(Transformers.aliasToBean(Patient.class))
详细文件如下:

对于托管实体,可以在Select查询中使用NEW关键字

List<Patient> patients = session.createQuery("SELECT NEW beans.Patient( idpatient, password) FROM Patient WHERE username='" + username + "'").list();
List patients=session.createQuery(“从患者中选择新bean.Patient(idpatient,密码),其中username='”+username+“”)”).List();
请注意,您必须首先定义构造函数


此处的详细文档:

您还可以使用
Hibernate标准来解决此问题

   public Patient getUserNameAndPassword(String username, Session session) {
    Criteria criteria = session.createCriteria(Patient.class);
    criteria.add(Restrictions.eq("username", username));
    ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.property("idpatient"));
    projectionList.add(Projections.property("password"));
    criteria.setProjection(projectionList);
    criteria.setResultTransformer(new AliasToBeanResultTransformer(Patient.class));
    if (!criteria.list().isEmpty()) {
        Patient patient = (Patient) list.get(0);
        return patient;
    } else {
        return null;
    }
}

您还可以使用
Hibernate条件
来解决此问题

   public Patient getUserNameAndPassword(String username, Session session) {
    Criteria criteria = session.createCriteria(Patient.class);
    criteria.add(Restrictions.eq("username", username));
    ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.property("idpatient"));
    projectionList.add(Projections.property("password"));
    criteria.setProjection(projectionList);
    criteria.setResultTransformer(new AliasToBeanResultTransformer(Patient.class));
    if (!criteria.list().isEmpty()) {
        Patient patient = (Patient) list.get(0);
        return patient;
    } else {
        return null;
    }
}