2012-02-23 3 views
0

У меня возникла небольшая проблема с спящим режимом, так как hibernate не принимает обычный синтаксис sql-запроса. Когда я отправляю свой запрос с помощью оператора select, который должен возвращать точное число из 37 в базу данных, я ничего не получаю взамен. Это запрос в синтаксисе sql: «выберите id из tbl_employee, где bsn = '36372837'", это возвращает 37. Но когда я выполняю этот запрос из спящего режима с помощью ссылок на объекты и дерьма, он не работает.Hibernate select query ничего не возвращает

Пожалуйста, проверьте мой код и посмотреть, если вы знаете, как решить эту проблему:

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); 
     } 
    } 

класс Employee:

@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. 
} 

класс TimeRegistration

@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) ; 
}} 

Спасибо заранее, Benjamin

+0

Возможно, вам нужно будет увидеть ваш объект Employee и настройки, которые вы установили (или аннотации) –

+0

oke Kevin Crowell Я добавил классы Employee и TimeRegistration, также добавил основную пустоту с объектами. – Ben

ответ

2

Вы используете метод getFirstResult().
Но этот метод возвращает позицию (целое число) записи в таблице.

Чтобы извлечь запись (объект), вместо этого вы должны использовать getSingleResult().

См. http://docs.oracle.com/javaee/6/api/javax/persistence/Query.html.

0

Am не человек 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(); 
+0

Спасибо @Sajan за ваши отзывы он мог бы иметь смысл, но он не работал: (... Я надеюсь, что некоторые другие люди могут мне помочь. – Ben

+0

@B Westra Попробуйте добавить пространство между вашими равными и «:» в вашем запросе . SELECT emp.id FROM Employee as emp WHERE emp.bsn =: bsn "; –

+0

Я пробовал, но он не работал. Он все равно возвращает 0, пока он должен возвращать 37. – Ben

0

Я нашел решение,

Integer id = (Integer) em.createQuery("select id from Employee where bsn =:bsn") 
.setParameter("bsn", object.getEmployee.getBsn()) 
.getSingleResult(); 

getSingleResult() возвращает объект, так что именно поэтому вы должны использовать Integer вместо междунар.