【问题标题】:Criteria.uniqueResult is returning null, but no error is thrownCriteria.uniqueResult 返回 null,但没有抛出错误
【发布时间】:2013-02-09 15:53:51
【问题描述】:

我刚刚学习休眠,我正在尝试查询表以查找具有特定 ID 的人。当我调用criteria.unique 结果时,没有抛出错误,但它返回一个空值,谁能帮我弄清楚发生了什么?

@Entity
@Table(name="employees")
public class Employee {
private long emp_no; 
private Date birth_date; 
private String first_name;
private String last_name;
private char gender;
private Date hire_date; 

private Set<DepartmentEmp> department_emp = new HashSet<DepartmentEmp>(); 
private Set<DepartmentManager> department_manager = new HashSet<DepartmentManager>();
private Set<Projects> projects; 
private ContactInfo contactInfo; 


public Employee(){};
public Employee(long empt_no, Date birth_date, String first_name, String last_name, 
        char gender, Date hire_date){
        this.emp_no = emp_no;
        this.birth_date = birth_date; 
        this.first_name = first_name;
        this.last_name = last_name;
        this.gender = gender; 
        this.hire_date = hire_date; 
}

 @Id
 @Column(name="emp_no")
    public long getEmp_no() { return emp_no; }
    public void setEmp_no(long emp_no) {this.emp_no=emp_no;}


 @Column(name="birth_date")
    public Date getBirth_date() { return birth_date; }
    public void setBirth_date(Date birth_date) {this.birth_date = birth_date;}


 @Column(name="first_name")
    public String getFirst_name() { return first_name; } 
    public void setFirst_name(String name) { this.first_name = name; }



 @Column(name="last_name")
    public String getLast_name() { return last_name; } 
    public void setLast_name(String name) { this.last_name = name; }


 @Column(name="gender")
    public char getGender() { return gender; } 
    public void setGender(char gender) {this.gender = gender;}


  @Column(name="hire_date")
    public Date getHire_date() { return hire_date; } 
    public void setHire_date(Date hire_date) {this.hire_date = hire_date;}

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinColumn(name="emp_no")
    public ContactInfo getContactInfo() { return contactInfo; }
    public void setContactInfo(ContactInfo info) { this.contactInfo = info; }

  @OneToMany(mappedBy="employee", targetEntity=DepartmentEmp.class,
    cascade=CascadeType.ALL)
  @Fetch(value = FetchMode.SELECT) 
    public Set<DepartmentEmp> getDepartment_emp() { return department_emp; }
    public void setDepartment_emp(Set<DepartmentEmp> department_emp) { this.department_emp = department_emp; }



    @OneToMany(mappedBy="employee", targetEntity=DepartmentManager.class,
    cascade=CascadeType.ALL)
    @Fetch(value = FetchMode.SELECT) 

    public Set<DepartmentManager> getDepartment_manager() { return department_manager; }
    public void setDepartment_manager(Set<DepartmentManager> department_manager) { this.department_manager = department_manager; }

    @ManyToMany
      @JoinTable(name="employee_projects", 
            joinColumns={@JoinColumn(name="employee_emp_no")},
            inverseJoinColumns={@JoinColumn(name="projects_proj_num")})
    @Fetch(value = FetchMode.SELECT) 
        public Set<Projects> getProjects() { return projects; }
        public void setProjects(Set<Projects> projects) { this.projects = projects; }

    public void print() {
        System.out.printf("%d: %s %s %s %c %s\n", emp_no, birth_date.toString(), first_name, last_name, gender, hire_date.toString()); 
    } 

    public static void list()
    {
        Session session = HibernateContext.getSession();
        Criteria criteria = session.createCriteria(Employee.class);
        criteria.addOrder(Order.asc("emp_no"));

        List <Employee> employees = criteria.list();
        System.out.println("All Employees:");
        for (Employee employee : employees) {
            employee.print();
        }
        session.close();
    }

    //TODO finish 4 methods

    public static Employee find(long emp_no){
        Employee prototype = new Employee();
        prototype.setEmp_no(emp_no);
        Example ex = Example.create(prototype);

        Session sess = HibernateContext.getSession();
        Criteria criteria = sess.createCriteria(Employee.class);
        criteria.add(ex);

        Employee e = (Employee) criteria.uniqueResult();
        return e;
    }
    public static Employee find(String first, String last){
        Employee prototype = new Employee();
        prototype.setFirst_name(first);
        prototype.setLast_name(last);
        Example ex = Example.create(prototype);

        Session sess = HibernateContext.getSession();
        Criteria criteria = sess.createCriteria(Employee.class);
        criteria.add(ex);

        Employee e = (Employee) criteria.uniqueResult();

        sess.close();
        return e;
    }
    public static void main(String [] args){
           Class klasses [] = {Employee.class, DepartmentEmp.class, DepartmentManager.class, ContactInfo.class,
                                Salaries.class, Titles.class, Department.class, Projects.class};
            HibernateContext.addClasses(klasses);
            Employee.find((long)10001).print();
    }
  }

休眠上下文:

public class HibernateContext {

public static AnnotationConfiguration config = null;
public static SessionFactory factory = null;

/**
 * sets configuration if null
 */
private static void setConfiguration(){
    if(config == null){
        config = new AnnotationConfiguration();
        config.configure();
    }
}

/**
 * sets factory if null
 */
private static void setFactory(){
    if(factory == null){
        setConfiguration();
        factory = config.buildSessionFactory();
    }
}

/**
 * Opens session from the factory
 */
public static Session getSession(){
    setFactory();
    return factory.openSession();
}

/**
 * Creates a schema from the configuration
 */
public static void createSchema(){
    setConfiguration();
    (new SchemaExport(config)).create(true, true);

}

/**
 * Adds a new class object to the database
 */
public static void addClass(Class c){
    setConfiguration();
    config.addAnnotatedClass(c);
}

/**
 * Adds a list of class objects to the database
 */
public static void addClasses(Class classes[]){
    for(Class c : classes){
        addClass(c);
    }
}

}

我省略了其他类,因为它们不参与此查询,但是当我在 Employee 中运行主函数时,堆栈跟踪只是在 find.print(); 处显示空指针异常;线。我知道数据库已填充并且正在运行 Employee.list() 工作只是找到,所以我正在努力找出究竟是什么问题。感谢您的帮助!

【问题讨论】:

  • 好的,所以我意识到默认构造函数将 char 性别初始化为 '' 而不是 null,这使得它也搜索查询寻找性别,我通过将其切换为字符串来修复它

标签: java mysql hibernate criteria-api


【解决方案1】:

没有堆栈跟踪,很难找到问题所在,这就是我的猜测:

如果我们看到你的打印方法;

public void print() {
        System.out.printf("%d: %s %s %s %c %s\n", emp_no, birth_date.toString(),
 first_name, last_name, gender, 
hire_date.toString()); 
    } 

即使 Employee 对象正确返回 .. 在 print 你得到的值 hire_date 如果您没有将hire_date 提供给employee object 并尝试调用hire_date.toString(),它将提供null pointer exception

确定返回的Employee对象是否有hire_date

【讨论】:

  • 检查数据库中 ID 为 10001 的员工对象。如果他已经有了租用日期,请忽略此答案。
  • 当你回到家时,我会将确切的堆栈跟踪放入其中,但它所说的只是我调用 print 的行上的空指针异常。在我的employee.find 方法中,criteria.unique result() 方法返回null,因此返回的employee 对象中根本没有值。员工 ID 确实存在,因为我选择了数据库中的一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2021-09-03
  • 1970-01-01
  • 2017-06-17
相关资源
最近更新 更多