HQL选择查询,其中条件不显示相同的结果

时间:2017-02-24 11:03:33

标签: hibernate hql

当我提交登录表单时,我被重定向到始终是一个错误页面。

检查以下内容:

  1. 以jsp格式提交的用户名和密码在DB中完全相同。所以我可以确认用户是否存在于DB中。
  2. 对java类中的值进行硬编码以检查它是否使用了正确的凭据,它运行正常。
  3. 的hibernate.cfg.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
     <session-factory>
      <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
      <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property>
      <property name="hibernate.connection.username">test</property>
      <property name="hibernate.connection.password">abc123</property>
      <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
      <property name="hibernate.default_schema">bmmblr</property>
      <property name="show_sql">true</property>
      <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <!-- Drop and recreate the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.cache.use_query_cache">false</property>
        <property name="hibernate.cache.use_second_level_cache">false</property>
    <!-- classes annotated @Entity -->
    <mapping class="com.bmm.inventory.bean.User"/>
    </session-factory>
    </hibernate-configuration>
    

    UserDAOImpl.java

    public int getUserbyCredentials(String userName, String passWord) {
        //User user = new User();
        System.out.println("Form values:"+userName+"  "+passWord);
        Session session = getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        System.out.println("Query Params:"+userName+"  "+passWord);
        Query query = session.createQuery(
                "select u.userName,u.passWord from User u where u.userName=:userName and u.passWord=:passWord");
        query.setString("userName", userName);
        query.setString("passWord", passWord);
        @SuppressWarnings("unchecked")
        List<User> list =(List<User>) query.list();
        System.out.println("Result:"+list+"  "+list.size());
        session.getTransaction().commit();
        session.close();
        return list.size();
    }
    

    行动类:

    public String execute() throws Exception {
        System.out.println("Entering execute method of Login Action"+this.getUserName()+"  "+this.getPassWord());
        SessionFactory sf = (SessionFactory) ctx.getAttribute("SessionFactory");
        UserDAO userDAO = new UserDAOImpl(sf);
        int userDB = userDAO.getUserbyCredentials(this.getUserName(), this.getPassWord());
        System.out.println("User Obj: "+userDB);
        if(userDB < 1)
            return "ERROR";
        else {
            return "SUCCESS";
        }
    }
    

    当我输入正确的凭据时,下面是在控制台中打印的输出。

    Form values : test  abc123
    
    Hibernate: select user0_.user_usa_name as col_0_0_, user0_.user_password as col_1_0_ from bmmblr.USERS user0_ where user0_.user_usa_name=? and user0_.user_password=?
    
    Count : 0
    

    Bean类:

    package com.bmm.inventory.bean;
    
    import java.util.Date;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.Table;
    
    @Entity
    @Table (name="USERS")
    public class User {
    
    
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPassWord() {
            return passWord;
        }
        public void setPassWord(String passWord) {
            this.passWord = passWord;
        }
        public String getLocation() {
            return location;
        }
        public void setLocation(String location) {
            this.location = location;
        }
        public Date getCreatedDate() {
            return createdDate;
        }
        public void setCreatedDate(Date createdDate) {
            this.createdDate = createdDate;
        }
        public String getUserStatusCode() {
            return userStatusCode;
        }
        public void setUserStatusCode(String userStatusCode) {
            this.userStatusCode = userStatusCode;
        }
    
        public Long getID() {
            return ID;
        }
        public void setID(Long iD) {
            ID = iD;
        }
        @Id
        @Column(name="user_id")
        @SequenceGenerator(name="userIdSeq", sequenceName="user_id_seq")
        @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="userIdSeq")
        private Long ID;
    
        @Column(name="user_usa_name")
        private String userName;
    
        @Column(name="user_password")
        private String passWord;
    
        @Column(name="user_location")
        private String location;
    
        @Column(name="user_created_dt")
        private Date createdDate;
    
        @Column(name="user_status_cd")
        private String userStatusCode;
    
    
    
    
    }
    

2 个答案:

答案 0 :(得分:0)

我很惊讶您在这里没有收到错误,因为您在查询中使用投影但期望用户实体列表:

Query query = session.createQuery(
            "select u.userName,u.passWord from User u where u.userName=:userName and u.passWord=:passWord");
    query.setString("userName", userName);
    query.setString("passWord", passWord);
    @SuppressWarnings("unchecked")
    List<User> list =(List<User>) query.list();

解决方案1 ​​

在查询中选择整个用户实体:

Query query = session.createQuery(
            "select u from User u where u.userName=:userName and u.passWord=:passWord");
    query.setString("userName", userName);
    query.setString("passWord", passWord);

解决方案2

Expect List of Object []然后逐个提取用户名和密码:

Query query = session.createQuery(
            "select u.userName,u.passWord from User u where u.userName=:userName and u.passWord=:passWord");
    query.setString("userName", userName);
    query.setString("passWord", passWord);
    @SuppressWarnings("unchecked")
    List<Object[]> list =(List<Object[]>) query.list();

    Object firstRow = list[0];      
    userName = (String)firstRow [0];
    passwd = (String)firstRow [1];
}

答案 1 :(得分:0)

最后,我可以在不使用符号设置参数的情况下实现此目的。我使用+符号来构建有效的查询。

// something like below

Query query = session.createQuery(
            "select * from User u where u.userName="+this.userName+"and u.passWord="+this.passWord");