Как я могу избежать создания лишних сущностей? - PullRequest
6 голосов
/ 28 октября 2011

В моем текущем проекте мне нужно выполнить несколько собственных запросов, которые выбирают некоторые поля из таблиц, объединенных в запрос, например ::100100

SELECT t1.col1, t2.col5
FROM t1
JOIN t2 ON t2.id = t1.t2_id

Я пытался хранить их в классе, подобном

class Result {
  String t1_col1;
  String t2_col5;
}

с использованием

Query q = entityManager.createNativeQuery( "THE SQL SELECT" , Result.class );

JPA теперь жалуется («неизвестный объект: результат»), что класс «результат» не является объектом, который, вероятно, требуется для сопоставления столбцов с объектом. Я также пытался повторить объявления @Column в классе результата.

Мой вопрос: как я могу объявить это, не создавая объекты в моей БД в виде таблиц?

Ответы [ 4 ]

6 голосов
/ 28 октября 2011

Увы, я не вижу способа сделать это в JPA.Однако вы можете сделать это с помощью объекта hibernate Query.чтобы получить его, используйте:

org.hibernate.Query query = q.unwrap(org.hibernate.Query.class);

и затем установите преобразователь результата. Смотрите здесь :

query.setResultTransformer(Transformers.aliasToBean(Result.class));
5 голосов
/ 28 октября 2011

Если вы используете JPA / Hibernate для выполнения запросов SQL, значит, вы используете не тот инструмент. Hibernate - это ORM, и вы должны отображать таблицы в сущности. В этом весь смысл JPA. Если вы просто хотите выполнять SQL-запросы, используйте JDBC (и Spring JdbcTemplate, например)

Как только table1 и table2 сопоставлены с сущностями (давайте назовем эти сущности T1 и T2), вам больше не понадобятся эти SQL-запросы, потому что JPQL может выбирать только некоторые поля сущностей. Ваш запрос может выглядеть следующим образом (в зависимости от связи между t1 и t2):

select t1.col1, t2.col5 from T1 t1 join t1.t2 t2

И вам просто нужно перебрать результат (список Object []), чтобы построить свои результаты (который является DTO, а не отображенной сущностью):

List<Object[]> rows = (List<Object[]>) query.list();
List<Result> listOfResults = new ArrayList<Result>(rows.size);
for (Object[] row : rows) {
    listOfResults.add(new Result((String) row[0], (String) row[1]));
}
1 голос
/ 28 октября 2011

Я могу выполнить этот запрос (с небольшим изменением) в JPA DataNucleus, и он работает нормально, как и должно в соответствии со спецификацией JPA.

SELECT t1.col1 AS t1_col1, t2.col5 AS t2_col5 FROM t1 JOIN t2 ON t2.id = t1.t2_id

Т.е. сделать так, чтобы возвращаемые столбцы совпали с именами полей в классе результатов. В спецификации JPA не сказано, что класс результата должен быть классом сущности; это просто говорит "класс получающегося экземпляра (ов)".

0 голосов
/ 28 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...