簡體   English   中英

休眠選擇查詢不返回任何內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM