UFO ET IT

JPA 및 Criteria API-특정 열만 선택

ufoet 2020. 12. 12. 11:53
반응형

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>).. 어떻게 변경해야합니까? 필드 TID있고 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귀하의 경우 와 같이 결과를 나타내는 클래스가 있으면 다른 접근 방식이 가능합니다 . TEntity 클래스 일 필요는 없습니다. 다음 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

https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#Constructors


우선, 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

반응형