JPA 및 Criteria API-특정 열만 선택
특정 열 (예 :) 만 선택하고 싶습니다 SELECT a FROM b
. 나는 일반 DAO를 가지고 있으며 내가 생각해 낸 것은 다음과 같습니다.
public List<T> getAll(boolean idAndVersionOnly) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<T> criteria = builder.createQuery(entityClazz);
Root<T> root = criteria.from(entityClazz);
if (idAndVersionOnly) {
criteria.select(root.get("ID").get("VERSION")); // HERE IS ERROR
} else {
criteria.select(root);
}
return manager.createQuery(criteria).getResultList();
}
오류는 다음과 같습니다 The method select(Selection<? extends T>) in the type CriteriaQuery<T> is not applicable for the arguments (Path<Object>)
.. 어떻게 변경해야합니까? 및 필드 T
만 ID
있고 VERSION
다른 모든 유형 은 null
.
이 두 필드가있는 유형이 T
확장 AbstractEntity
됩니다.
entityClazz
입니다 T.class
.
특정 열만 가져 오는 JPA 방법 중 하나는 Tuple 객체 를 요청하는 것입니다.
귀하의 경우 다음과 같이 작성해야합니다.
CriteriaQuery<Tuple> cq = builder.createTupleQuery();
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION)); //using metamodel
List<Tuple> tupleResult = em.createQuery(cq).getResultList();
for (Tuple t : tupleResult) {
Long id = (Long) t.get(0);
Long version = (Long) t.get(1);
}
T
귀하의 경우 와 같이 결과를 나타내는 클래스가 있으면 다른 접근 방식이 가능합니다 . T
Entity 클래스 일 필요는 없습니다. 다음 T
과 같은 생성자가있는 경우 :
public T(Long id, Long version)
그런 다음 생성자 T
에서 직접 사용할 수 있습니다 CriteriaQuery
.
CriteriaQuery<T> cq = builder.createQuery(T.class);
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION)); //using metamodel
List<T> result = em.createQuery(cq).getResultList();
자세한 내용은이 링크 를 참조하십시오.
cq.select(cb.construct(entityClazz.class, root.get("ID"), root.get("VERSION"))); // HERE IS NO ERROR
우선, ID와 버전 만있는 개체와 다른 모든 소품이 null이되는 이유를 알지 못합니다. 그러나 여기에 당신을 위해 그것을 할 코드가 있습니다 (JPA Em을 사용하지 않지만 정상적인 Hibernate. JPA에서 동등성을 찾거나 단순히 EJB에서 Hibernate Session에 액세스 하는 em 대리자로부터 Hibernate Session obj를 얻을 수 있다고 가정합니다. EntityManager 사용 ) :
List<T> results = session.createCriteria(entityClazz)
.setProjection( Projections.projectionList()
.add( Property.forName("ID") )
.add( Property.forName("VERSION") )
)
.setResultTransformer(Transformers.aliasToBean(entityClazz);
.list();
This will return a list of Objects having their ID and Version set and all other props to null, as the aliasToBean transformer won't be able to find them. Again, I am uncertain I can think of a situation where I would want to do that.
You can do something like this
Session session = app.factory.openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery();
Root<Users> root = query.from(Users.class);
query.select(root.get("firstname"));
String name = session.createQuery(query).getSingleResult();
where you can change "firstname" with the name of the column you want.
참고URL : https://stackoverflow.com/questions/12618489/jpa-criteria-api-select-only-specific-columns
'UFO ET IT' 카테고리의 다른 글
H.264 비디오와 MPEG-4 비디오의 차이점은 무엇입니까? (0) | 2020.12.12 |
---|---|
V8 JavaScript (Chrome 및 Node.js)에서 줄 번호에 액세스 (0) | 2020.12.12 |
테스트 목적으로 자체 서명 된 SSL 인증서를 만드는 방법은 무엇입니까? (0) | 2020.12.12 |
uint8_t ≠ unsigned char은 언제입니까? (0) | 2020.12.12 |
Bearer 토큰은 Web API 2에서 서버 측에 어떻게 저장됩니까? (0) | 2020.12.12 |