Отображение пользовательских именованных / собственных запросов в объекты

1

Возможно ли сопоставление пользовательских собственных/именных запросов с сущностями? У меня есть что-то вроде этого

NamedQueries({
    NamedQuery(name = "StateBo.findByCountry", query = "SELECT state FROM StateBo state WHERE state.country.id = ?"),
    NamedQuery(name = "StateBo.showIdfindByCountry", query = "SELECT state.id FROM StateBo state WHERE state.country.id = ?")
})
@Table(name = "STATE")
@Entity(name = "StateBo")
public class StateBo extends BaseNamedBo {

    private static final long serialVersionUID = 3687061742742506831L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STATE_ID")
    private Long id;

    @Column(name = "ISO_CODE")
    private String isoCode;

    @ManyToOne
    @JoinColumn(name = "COUNTRY_ID")
    private CountryBo country;

   // getters and setters ...
}

У меня есть способ вызвать запросы Native/Named, подобные этому.

@Override
public List<E> executeQuery(String queryName, List<Object> criteria) {
TypedQuery<E> query = entityManager.createNamedQuery(queryName, entityClass);
Integer argumentPosition = 1;
if ( (criteria != null) && (criteria.size() > 0) ){
  for(Object object : criteria) {
    query.setParameter(argumentPosition, object);
    argumentPosition++;
  }
}
return (List<E>) query.getResultList();
}

Когда я вызываю StateBo.findByCountry, результат сопоставляется с StateBo, но если я вызываю StateBo.showIdfindByCountry, результат не сопоставляется с StateBo, потому что я выбираю только запрос state.id вместо полей в таблице.

Я не хочу выбирать все поля таблицы STATE, в этом случае я хочу только state.id, но когда я настраиваю свой собственный запрос, результат не сопоставляется с StateBo вместо этого, результатом является Long тип.

Мой вопрос: возможно ли сопоставить Entity результат StateBo.showIdfindByCountry? В случае, если у меня есть больше полей, таких как state.isoCode, возможна ли карта в StateBo, пользовательский запрос? или только возможно, если я верну все поля из запроса, например, первый запрос StateBo.findByCountry

  • 0
    Даже не думай делать это. Вы и ваши коллеги пострадают от такого дизайнерского решения. Если метод возвращает экземпляры StateBo, вызывающая сторона ожидает получить фактические присоединенные экземпляры StateBo. Неотключенные экземпляры StateBo, где все поля имеют нулевое значение и все инварианты нарушены, поскольку он содержит только идентификатор. Метод, возвращающий идентификаторы, должен возвращать List<Long> . Метод, возвращающий пары ID / код, должен возвращать List<StateIdAndCode> . Обратите внимание, что возврат 2 из 3 полей сущности не приведет к значительному повышению производительности по сравнению с возвратом самих сущностей.
  • 0
    Кроме того: вы продолжаете использовать термин собственный запрос, но ваши запросы не являются собственными. Нативные запросы - это запросы, написанные на SQL вместо JPQL.
Показать ещё 2 комментария
Теги:
spring
hibernate
jpa
eclipselink

1 ответ

0

Это возможно, но, как сказал JB Nizet, "ваши коллеги будут страдать от такого дизайнерского решения".

В любом случае, чтобы сделать это, вы должны создать пользовательский конструктор в своем классе сущности. Этот конструктор должен принимать Long аргумент и назначать его в поле id вашего класса сущности.

Затем вы должны изменить свой запрос на ключевое слово NEW за которым следует полное имя класса класса, как показано ниже:

SELECT NEW your.package.StateBo(sb.id)
FROM StateBo sb
WHERE state.country.id = ?

Обратите внимание, что все объекты, полученные из базы данных таким образом, не будут управляться контекстом персистентности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню