JPA @NamedQuery с двумя таблицами, возможно? - PullRequest
0 голосов
/ 22 декабря 2009

У меня какая-то фиктивная проблема, мне нужно сделать @NamedQuery с объединением с другой таблицей, какая-то простая вещь.

Но во всех моих @NamedQuery я имею дело только с моим отображенным объектом / таблицей.

Например, в моей карте объектов / таблиц автомобилей :

@NamedQuery(name = Cars.GET_AVAILABLE_CARS, 
    query = "select c.id from Cars c where c.status = (select d.status from CarStatus d where d.color=red)")

Я пытаюсь использовать: @SecondaryTables, но пока безуспешно.

Еще одна вещь, которая работает, это дать все вещи из другой таблицы в качестве параметра, но я не думаю, что это будет хорошо с точки зрения производительности.

Как:

@NamedQuery(name = Cars.GET_AVAILABLE_CARS, query = 
     "select c.id from Cars c where c.status = :" + CarStatusParam)

Какие-нибудь советы?

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 22 декабря 2009

Именованный запрос может использовать все, что может использовать запрос API, так же как и подзапросы. Какая реализация JPA?

1 голос
/ 26 августа 2012

Полагаю, у вас есть что-то вроде этого:

@Entity
public class Cars{
    private String status;
    //... something else
}

@Entity
public class CarStatus{
    private String status;
    private String color;
    //... something else
}

если это так, измените это

@Entity
public class Cars{
    private CarStatus status;  //<--THIS!!
    //... something else
}

@Entity
public class CarStatus{
    private String color;
    //... something else
}

, а затем обновите свой NamedQuery следующим образом:

query ="select c.id from Cars c where c.status.color = 'red'" 

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

query = "select c.id from Cars c join CarStatus d where c.status = d.status and d.color = 'red'"
1 голос
/ 23 декабря 2009

То, что вы пытаетесь сделать, не является объединением. Это подвыбор. И с точки зрения производительности это так же (не) эффективно, как получить параметр заранее.

Однако, если вы настаиваете на использовании подвыбора, его поддерживает JPA Query Language. Как он поддерживает присоединения. Взгляните сюда (на 7.11 8.11. Подзапросы).

0 голосов
/ 13 декабря 2018

Ответ - да, это возможно. Вы должны убедиться, что ваши столбцы определяют, какую таблицу искать. См. Приведенный ниже код, указанный вами запрос должен работать после этого добавления.

@Column(table = "SECONDARY_TABLE", name = "EXAMPLE_COLUMN_NAME") private String example;

...