Criteria.uniqueResult返回null,但不会引发错误
我刚刚学习hibernate,我试图查询表以找到具有特定id的人。当我打电话给criteria.unique结果,没有错误被抛出,但它返回一个空值,任何人都可以帮助我弄清楚最后会发生什么?Criteria.uniqueResult返回null,但不会引发错误
@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();
}
}
HibernateContext:
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);
}
}
}
我已经中省略了其它类,因为他们arent参与此查询,但是当我运行在员工的主要功能,堆栈跟踪只是说find.print();空指针异常线。我知道数据库已经填充并且正在运行的Employee.list()只能找到,所以我正在努力弄清楚究竟是什么错误。谢谢您的帮助!
随着出堆栈跟踪它很难找到什么是错,这里是我猜测:
如果我们看到您打印方法;
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检查DB中的员工对象。如果他已经有hire_date,请忽略此答案。 – 2013-02-09 16:59:53
当你回家的时候,我会把确切的堆栈跟踪放在里面,但是它所说的是我称之为打印的行上的空指针异常。在我的employee.find方法中,criteria.unique result()方法返回null,所以返回的employee对象中根本没有值。员工ID确实存在,因为我选择了数据库中的一个 – Wonger 2013-02-09 20:22:57
OKY,所以我意识到,默认的构造函数初始化字符性别作为“”,而不是零,这使得它,所以它也搜寻查询寻找性别,我固定通过将其切换为字符串 – Wonger 2013-02-09 23:47:53