Присоединитесь к отношениям JPA OneToOne в столбцах первичного ключа

У меня есть две таблицы - таблица one и таблица two, как показано ниже -

Таблица 2:

    model    | customer_capacity| total

    samsung  | 300              | 20000

где модель - это первичный ключ таблицы 2.

Таблица первая:

    model     | count1 | addition | stuff

    samsung   | 20     | 34       | 2

где модель - это первичный ключ первой таблицы

Ниже приведены классы для каждой сущности (таблиц), которые я создал.

// Таблица первая: -

    @Entity
    @Table(name = "one")
    @NamedQueries({
            @NamedQuery(name = "getModelData",
                    query = "SELECT a.count1, a.addition, d.customerCapacity  FROM one a  JOIN FETCH two d where d.model = a.model and a.model = :model")
    })

public class One {
    @Id
    @Column(name = "model")
    private String model;

    @OneToOne
    @JoinColumn(name = "model", insertable = false, updatable = false)
    private Two t0;


    @Column(name = "count1")
    private double count1;

    @Column(name = "addition")
    private double addition;

    // getters and setters
}

// Таблица два объекта:

@Entity
@Table(name = "two")
public class Two {
    @Id
    @Column(name = "model")
    private String model;

    @Column(name = "customer_capacity")
    private int customerCapacity;

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

    // getters and setters
}

Постановка проблемы: -

Я хотел написать запрос в JPA, который должен вернуть мне следующие данные:

Select a.count1, a.addition, b.customer_capacity from one a, two b where a.model = b.model and a.model = 'samsung';

Выход:

count1 | addition   | customer_capacity
20     |  34        | 300

Но я не уверен, как заставить это работать в JPA? Я пытаюсь выполнить вышеупомянутый запрос, который я создал в двух вышеупомянутых классах, но каждый раз он выдает ошибку - вот код, который я использую для извлечения данных -

 // method to get the data
public One getModelData(final String model) throws Exception {

    EntityManager em = factory.getPEntityManager();
    try {

        final Query q = em.createNamedQuery("getModelData");
        q.setParameter("model", mdoel);
        model = (One) q.getSingleResult();

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        factory.closeEntityManager(em);
    }
    return model;
}

И я получаю исключение -

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.hello.jpa.One

Как мне написать такой запрос на соединение с использованием JPQL в Java?


person AKIWEB    schedule 12.01.2015    source источник


Ответы (2)


Если вы работаете с NetBeans, вы можете проверить свой запрос, просто щелкните правой кнопкой мыши файл persistence.xml и выберите «Выполнить запрос JPQL». Там вы сможете быстро протестировать свой запрос и выбрать подходящие параметры.

person KrisUMCS    schedule 12.01.2015

выберите a.count1, a.addition, a.t0.customerCapacity из One a, где a.model = 'samsung';

И вы не получите Object of One просто, он вернет массив Object model = (One) q.getSingleResult ();

Чтобы получить объект One, вам нужно будет написать правильный конструктор в классе One, имеющий параметры, как указано выше, в трех полях, и запрос изменится на

выберите новый One (a.count1, a.addition, a.t0.customerCapacity) из One a, где a.model = 'samsung';

person Nishat    schedule 13.01.2015