Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Выборка из двух таблиц JPA


Автор: sandycat 4.6.2011, 18:13
У меня есть класс

Reservation.java
Код

package reservation.bean;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

@javax.persistence.Entity
@Table(name = "reservation")
@SecondaryTable(name="testmachine")
@NamedQueries({
@NamedQuery(
        name = "getActiveReservationByStatus",
        query = "select reservation from Reservation reservation where reservation.status=:status"),
@NamedQuery(
        name = "getMachineNameByActiveReservation",
        query = "select reservation.userId, machine.machineName " +
                "from Reservation reservation, Machine machine " +
                "where reservation.id = machine.id and reservation.status=:status"),  

       })

public class Reservation implements Serializable {
    @javax.persistence.Id
    @Column(name = "reservation_id")
    @javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
    private int id;
    @Column(name = "reservation_status")
    private int status = 1;
    @Column(name = "user_id")
    private int userId;
    
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="reservation")
    private List<Machine> machineResultList;   

    public Reservation() {
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public int getStatus() {
        return status;
    }

     public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getUserId() {
        return userId;
    }
}



результат запроса я записываю в ArrayList
1.
Код

public ArrayList<Reservation> getActiveReservationByStatus(int statusId) {     
        Query query = entityManager.createNamedQuery("getActiveReservationByStatus");
        query.setParameter("status", statusId);
        return (ArrayList<Reservation>) query.getResultList();
    }

или
2.
Код

public ArrayList<Reservation> getMachineNameByActiveReservation(int stateId) {     
        Query query = entityManager.createNamedQuery("getMachineNameByActiveReservation");
        query.setParameter("status", stateId);
        return (ArrayList<Reservation>) query.getResultList();
    } 


если в первом варианте (запрос работает только с одной таблицей) он выдавал следующее
Код

[reservation.bean.Reservation@7dc8f91e, 
...
 reservation.Reservation@7dc8f91e];

и я могла выбрать элементы из коллекции, например, reservation.getUserId()

то во втором (запрос идет по двум таблицам) у меня никак не получается, что-то он там да выбирает
Код

[[Ljava.lang.Object;@2eb80f1c, 
[Ljava.lang.Object;@35e80f3a, 
[Ljava.lang.Object;@163fc47c, 
... 
[Ljava.lang.Object;@5fb7565, 
[Ljava.lang.Object;@3fd83cf4]; 

только я не знаю как посмотреть что именно и правильно ли. Подскажите пожалуйста куда копать?

Автор: RageSteel 5.6.2011, 10:21
Первом случае ты вибираешь одну сущность и в результате у тебя будет соответствующий объекта класса этой сущности. Во втром случае, ты выбираешь конкретные поля и результат у тебя будет в виде массива выбираемых объектов.

Автор: sandycat 5.6.2011, 16:05
RageSteel, каким образом я могу добраться до значений?

Думала, что настроив связи OneToMany, ManyToOne они замапятся и я их определенными гетерами заберу. Но я чет не могу этого сделать, где-то ошиблась.


Автор: RageSteel 5.6.2011, 17:57
А что ты хочешь сказать этим своим запросом?

Код

select reservation.userId, machine.machineName
from Reservation reservation, Machine machine
where reservation.id = machine.id and reservation.status=:status


Почему ты выбираешь reservation.id = machine.id ?
Может лучше тебе выбирать из machine? Как-то так:
Код

SELECT m FROM Machine m WHERE m.reservation.status = :status


Тогда из сущности Machine ты сможешь получить объект Reservation.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)