Возможно ли сопоставление пользовательских собственных/именных запросов с сущностями? У меня есть что-то вроде этого
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
Это возможно, но, как сказал JB Nizet, "ваши коллеги будут страдать от такого дизайнерского решения".
В любом случае, чтобы сделать это, вы должны создать пользовательский конструктор в своем классе сущности. Этот конструктор должен принимать Long
аргумент и назначать его в поле id
вашего класса сущности.
Затем вы должны изменить свой запрос на ключевое слово NEW
за которым следует полное имя класса класса, как показано ниже:
SELECT NEW your.package.StateBo(sb.id)
FROM StateBo sb
WHERE state.country.id = ?
Обратите внимание, что все объекты, полученные из базы данных таким образом, не будут управляться контекстом персистентности.
List<Long>
. Метод, возвращающий пары ID / код, должен возвращатьList<StateIdAndCode>
. Обратите внимание, что возврат 2 из 3 полей сущности не приведет к значительному повышению производительности по сравнению с возвратом самих сущностей.