2016-02-21 67 views
5

Używam MVC wzór Mam dwie tabele: pracownika oraz adresJak uzyskać zestaw wyników w kodzie Java, od procedury przechowywanej w plsql

powiedzieć, Pracownik jest jak

------------------- 
Id | Name | DeptId 
------------------- 
101 | Jake | 501 
102 | Donald | 502 

i mam jeden stół Departament jak

----------------------------- 
DeptId | Name | Description 
----------------------------- 
501 | IT | software assistance 
502 | HR | Human resources 

odkąd używam MVC tabele te są przypisane do klas jak

@Table(name="Employee") 
Class Employee{ 
    @Id 
    @Column(name="Id") 
    private Long id; 

    @Column(name="Name") 
    private String name; 

    @Column(name="DeptId") 
    private Long deptId; 

    @ManyToOne 
    @JoinColumn(name="DeptId", referencedColumnName="id", insertable=false,updatable=false) 
    private Department dept; 

    //getters and setters go here 
} 

a drugi Departament klasa (mapowane do tabeli Department)

@Table(name="Department") 
    Class Department{ 
     @Id 
     @Column(name="Id") 
     private Long id; 

     @Column(name="Name") 
     private String name; 

     @Column(name="Description") 
     private String description; 

     //getters and setters go here 
    } 

zauważyć, że klasa pracownik ma odniesienie do obiektu klasy Department. This @ManyToOne i @JoinColumn adnotacje pomaga nam w automatyczne pobieranie odpowiedniego obiektu towarowy wraz z obiektem pracownika

jej łatwo z zapytań bezpośrednio w kodzie ale jak można to zrobić, jeśli mam używać tylko procedur lub funkcji w mój kod próbowałem różnych metod, ale nie wydaje się, aby pomóc

Czasami dostaję coś takiego błędu Cannot return resultset from a stored procedure in oracle 10g

Może ktoś proszę wyjaśnić. Również muszę użyć JNDI

Czy mogę uzyskać wynik z procedury/funkcji w taki sposób, że zwraca mi List<Employee> (nie surowy zestaw wyników, który sam muszę podzielić na obiekty). Powinno być możliwe użycie hibernacji nie?

dzięki

Odpowiedz

-1

piszę Pseudokod (nie działający przykład). Ale to powinno rozwiązać problem.

Oracle

CREATE OR REPLACE PROCEDURE getEmployees(deptName varchar(20)) 
BEGIN 
    SELECT * FROM Employee where DeptId in (select DeptId from Department where Name =deptName); 

END; 
/

Hibernate

Query query = session.createSQLQuery(
    "CALL GetStocks(:getEmployees)") 
    .addEntity(Employee.class) 
    .setParameter("deptName", "Production"); 

List result = query.list(); 
for(int i=0; i<result.size(); i++){ 
    Employee emp = (Employee)result.get(i); 
    System.out.println(emp.toString()); 
} 
+0

** Przepraszamy! Muszę wybrać pracowników, a nie działy! Każdy pracownik jest mapowany do dept z powodu kolumny deptId. Chcę odpowiedni przedmiot Departamentu w dziedzinie "dept" pracownika. Jest to proste, jeśli używasz kwerend w kodzie java, ale nie tak łatwo w przypadku procedur, które moim zdaniem ** – Sarabjeet

+0

Zmodyfikowali pseudo kod. Musisz to wypróbować –

+1

Czy masz dobry powód, by krzyczeć **? –

1

Twój PLSQL musi zwrócić ref cursor.

JPA 2.1 obsługuje mapowanie CallableStatement out kursorów na Entities. Zobacz ten answer.