[英]Hibernate select query returns nothing
由於休眠不接受正常的SQL查詢語法,因此休眠有一個小問題。 當我用select語句發送查詢時,該查詢應將精確的37整數返回數據庫,而我卻一無所獲。 這是sql語法中的查詢:“從tbl_employee中選擇id,其中bsn ='36372837'”將返回37。但是,當我從休眠狀態下使用al對象引用執行該查詢並廢棄它時,它將無法正常工作。
請檢查我的代碼,看看您是否知道如何解決該問題:
public void RegisterWorkHours(TimeRegistration object)
{
EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("timereg");
EntityManager em = emf.createEntityManager();
try
{
String get_employee_id = "SELECT emp.id FROM Employee as emp WHERE emp.bsn=:bsn";
Query employee_query = em.createQuery(get_employee_id);
employee_query.setParameter("bsn", object.getEmployee().getBsn());
int id = employee_query.getFirstResult();
System.out.println("query returns employee id: " + id);
object.getEmployee().setId(id);
String get_project_id = "SELECT p.projectID FROM Project as p WHERE p.projectname=:projectname";
Query project_query = em.createQuery(get_project_id);
project_query.setParameter("projectname", object.getProject().getProjectname());
int projectid = project_query.getFirstResult();
System.out.println("query returns projectid: " + projectid);
object.getProject().setProjectID(projectid);
em.getTransaction().begin();
em.persist(object);
em.getTransaction().commit();
}
catch (Exception ex)
{
System.out.println(ex);
}
}
員工類別:
@Entity
@Table(name = "tbl_employee")
public class Employee
{
@Id
@SequenceGenerator(name="employeeSequence", sequenceName="SEQ_EMPLOYEE", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="employeeSequence")
@Column(name="id")
private int id;
@Column(name = "bsn")
@NaturalId
private String bsn;
@Column(name = "first_name")
private String firstname;
@Column(name = "last_name")
private String lastname;
@Column(name="birth_date")
private String birthDate;
@Column(name="address")
private String address;
@Column(name="house_number")
private String houseNumber;
@Column(name="city")
private String city;
@Column(name="zip")
private String zip;
//Constructor
protected Employee() {}
public Employee(String bsn, String firstname, String lastname)
{
setBsn(bsn);
setFirstname(firstname);
setLastname(lastname);
}
public Employee(String bsn, String firstname, String lastname, String address, String housenumber)
{
setBsn(bsn);
setFirstname(firstname);
setLastname(lastname);
setAddress(address);
setHouseNumber(housenumber);
}
public Employee(String bsn, String firstname, String lastname, String address, String housenumber, String zip, String city)
{
setBsn(bsn);
setFirstname(firstname);
setLastname(lastname);
setAddress(address);
setHouseNumber(housenumber);
setZip(zip);
setCity(city);
}
//The rest is one big list of getters and setters.
}
時間注冊課程
@Entity
@Table(name = "tbl_timeregtest")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class TimeRegistration
{
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Project project;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Employee employee;
@Id
@SequenceGenerator(name="timeregSequence", sequenceName="SEQ_TIMEREG", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="timeregSequence")
@Column(name="ID")
private int ID;
@Column(name="date")
private String date;
@Column(name="hours")
private int hours;
//Constructor
protected TimeRegistration() {}
public TimeRegistration(Project project, Employee employee, String date, int hours )
{
setProject(project);
setEmployee(employee);
setDate(date);
setHours(hours);
}
//the rest is all getter setter stuff
}
主要空白
public class Main
{
public static void main(String [ ] args)
{
Persistence persistence = new Persistence();
Project project = new Project("AlphaMouse", "11-2-2013", "12-4-2019");
Employee employee = new Employee("398723912", "Stoel", "Stra");
TimeRegistration register = new TimeRegistration(project, employee, "21-2-2024", 8);
persistence.RegisterWorkHours(register) ;
}}
在此先感謝,本傑明
您正在使用方法getFirstResult()
。
但是此方法返回表中記錄的位置(整數)。
要檢索記錄(對象),應改用getSingleResult()
。
請參閱http://docs.oracle.com/javaee/6/api/javax/persistence/Query.html 。
不是JPA的人,如果道歉沒有道理,請嘗試將您的查詢包含在事務中
em.getTransaction().begin();
String get_employee_id = "SELECT emp.id FROM Employee as emp WHERE emp.bsn=:bsn";
Query employee_query = em.createQuery(get_employee_id);
employee_query.setParameter("bsn", object.getEmployee().getBsn());
long id = employee_query.getFirstResult();
System.out.println("query returns employee id: " + id);
em.getTransaction().commit();
我找到了解決方案,
Integer id = (Integer) em.createQuery("select id from Employee where bsn =:bsn")
.setParameter("bsn", object.getEmployee.getBsn())
.getSingleResult();
getSingleResult()返回一個對象,因此這就是為什么您必須使用Integer而不是int的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.