IT

JPA getSingleResult() 또는 늘

itgroup 2022. 10. 28. 20:51
반응형

JPA getSingleResult() 또는 늘

는 i i나 an an an i i i i i i i 。insertOrUpdateEntity존재하지 않는 경우 갱신하거나 존재하지 않는 경우 갱신합니다.하게 하려면 , 「」를 사용할 가 있습니다.findByIdAndForeignKey「」를 null이치노문제는 그것이 존재하는지 어떻게 확인하느냐는 것입니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★.getSingleResult

public Profile findByUserNameAndPropertyName(String userName, String propertyName) {
    String namedQuery = Profile.class.getSimpleName() + ".findByUserNameAndPropertyName";
    Query query = entityManager.createNamedQuery(namedQuery);
    query.setParameter("name", userName);
    query.setParameter("propName", propertyName);
    Object result = query.getSingleResult();
    if (result == null) return null;
    return (Profile) result;
}

getSingleResultException

감사해요.

예외를 두는 것은 찾을 수 없다는 것을 나타냅니다.개인적으로 이런 API는 참을 수 없어요.이로 인해 실제로는 아무런 이득이 없는 가짜 예외 처리가 강제됩니다.코드를 트라이캐치 블록으로 감싸기만 하면 됩니다.

또는 목록을 쿼리하여 목록이 비어 있는지 확인할 수 있습니다.그렇다고 예외가 되는 건 아니에요.실제로는 프라이머리 키 검색을 기술적으로 실행하지 않기 때문에 (외부 키 또는 제약 조건의 조합으로 인해 하나 또는 둘 다 실행이 불가능하더라도) 여러 개의 결과가 있을 수 있습니다.따라서 이 솔루션이 더 적절할 것입니다.

Java 8에서 다음을 수행합니다.

Optional first = query.getResultList().stream().findFirst();

로직을 다음과 같은 도우미 방식으로 캡슐화했습니다.

public class JpaResultHelper {
    public static Object getSingleResultOrNull(Query query){
        List results = query.getResultList();
        if (results.isEmpty()) return null;
        else if (results.size() == 1) return results.get(0);
        throw new NonUniqueResultException();
    }
}

이를 위한 적절한 옵션은 다음과 같습니다.

public static <T> T getSingleResult(TypedQuery<T> query) {
    query.setMaxResults(1);
    List<T> list = query.getResultList();
    if (list == null || list.isEmpty()) {
        return null;
    }

    return list.get(0);
}

(Java 8에서):

query.getResultList().stream().findFirst().orElse(null);

JPA 2.2부터가 아니라.getResultList()목록이 비어 있는지 확인하거나 스트림을 생성하면 스트림을 반환하고 첫 번째 요소를 가져올 수 있습니다.

.getResultStream()
.findFirst()
.orElse(null);

스프링에는 다음과 같은 유틸리티 방법이 있습니다.

TypedQuery<Profile> query = em.createNamedQuery(namedQuery, Profile.class);
...
return org.springframework.dao.support.DataAccessUtils.singleResult(query.getResultList());

이 문제에 대처하기 위해 try/catch 메커니즘을 사용하는 경우.if/filter처럼 동작할 수 있습니다.기존 레코드를 찾을 수 없을 때 try/catch를 사용하여 새 레코드를 추가했습니다.

try {  //if part

    record = query.getSingleResult();   
    //use the record from the fetched result.
}
catch(NoResultException e){ //else part
    //create a new record.
    record = new Record();
    //.........
    entityManager.persist(record); 
}

다음은 Rodrigo IronMan의 구현을 기반으로 한 유형/일반 버전입니다.

 public static <T> T getSingleResultOrNull(TypedQuery<T> query) {
    query.setMaxResults(1);
    List<T> list = query.getResultList();
    if (list.isEmpty()) {
        return null;
    }
    return list.get(0);
}

제가 추천하는 대안은 다음과 같습니다.

Query query = em.createQuery("your query");
List<Element> elementList = query.getResultList();
return CollectionUtils.isEmpty(elementList ) ? null : elementList.get(0);

이렇게 하면 Null Pointer Exception에 대해 보호되며 1개의 결과만 반환됩니다.

그러니 그러지 마세요!

두 가지 옵션이 있습니다.

  1. 선택 항목을 실행하여 결과 세트의 COUNT를 가져오고 이 카운트가 0이 아닌 경우에만 데이터를 가져옵니다.

  2. 다른 종류의 쿼리(결과 세트를 가져오는 쿼리)를 사용하여 결과가 0 이상인지 확인합니다.1이 있어야 하므로 결과 수집에서 이 값을 빼면 됩니다.

두 번째 제안을 따르겠어요, 클레투스 의견에 동의해요.(잠재적으로) 2개의 쿼리보다 뛰어난 성능을 제공합니다.작업량도 적습니다.

기존 응답의 유용한 비트(결과 수 제한, 결과 고유성 확인)와 확립된 메서드 이름(Hibernate)을 조합하면 다음과 같은 결과를 얻을 수 있습니다.

/**
 * Return a single instance that matches the query, or null if the query returns no results.
 *
 * @param query query (required)
 * @param <T> result record type
 * @return record or null
 */
public static <T> T uniqueResult(@NotNull TypedQuery<T> query) {
    List<T> results = query.setMaxResults(2).getResultList();
    if (results.size() > 1) throw new NonUniqueResultException();
    return results.isEmpty() ? null : results.get(0);
}

되어 있지 않은 방식.uniqueResultOptional 참조query. query.로 하겠습니다.NoResultException 전화하시면 .query.uniqueResultOptional().orElse(null).

이이결 using using using using using 를 사용하여 했습니다.List<?> myList = query.getResultList();.myList.size()0으로 하다

다음 코드를 보세요.

return query.getResultList().stream().findFirst().orElse(null);

findFirst() a null (Null Pointer) Null Pointer (늘 포인터)를 던질 수 .★★★★★★ 。

최적의 어프로치는 다음과 같습니다.

return query.getResultList().stream().filter(Objects::nonNull).findFirst().orElse(null);

Google Guava 및 TypeQuery를 사용하여 다른 사용자가 제안한 것과 동일한 논리(resultList 가져오기, 유일한 요소 또는 null 반환)를 소개합니다.

public static <T> getSingleResultOrNull(final TypedQuery<T> query) {
    return Iterables.getOnlyElement(query.getResultList(), null); 
}

Guava는 의도하지 않은 IlgalArgument를 반환하는 것에 주의해 주십시오.결과 세트에 여러 개의 결과가 있는 경우 예외입니다.(이 예외는 getOnlyElement()의 클라이언트에게는 의미가 있지만 getSingleResultOrNull()의 클라이언트에서는 이해하기 어렵습니다.

이번엔 스칼라에서 또 다른 내선번호가 있습니다.

customerQuery.getSingleOrNone match {
  case Some(c) => // ...
  case None    => // ...
}

이 포주의 경우:

import javax.persistence.{NonUniqueResultException, TypedQuery}
import scala.collection.JavaConversions._

object Implicits {

  class RichTypedQuery[T](q: TypedQuery[T]) {

    def getSingleOrNone : Option[T] = {

      val results = q.setMaxResults(2).getResultList

      if (results.isEmpty)
        None
      else if (results.size == 1)
        Some(results.head)
      else
        throw new NonUniqueResultException()
    }
  }

  implicit def query2RichQuery[T](q: TypedQuery[T]) = new RichTypedQuery[T](q)
}

따라서 이 페이지의 모든 "예외 없이 다시 쓰기" 솔루션에는 사소한 문제가 있습니다.Non Unique 예외를 발생시키지 않거나 잘못된 경우에 발생시키지 않습니다(아래 참조).

적절한 해결책은 (아마도) 다음과 같습니다.

public static <L> L getSingleResultOrNull(TypedQuery<L> query) {
    List<L> results = query.getResultList();
    L foundEntity = null;
    if(!results.isEmpty()) {
        foundEntity = results.get(0);
    }
    if(results.size() > 1) {
        for(L result : results) {
            if(result != foundEntity) {
                throw new NonUniqueResultException();
            }
        }
    }
    return foundEntity;
}

목록에 0 요소가 있는 경우 null로 반환되며 목록에 다른 요소가 있는 경우 nonunique를 반환하지만 선택 항목 중 하나가 올바르게 설계되지 않은 경우 nonunique를 반환하지 않고 동일한 개체를 여러 번 반환합니다.

편하게 말씀해주세요.

결과 리스트를 받아서 비어있는지 확인해서 이 작업을 수행했습니다.

public boolean exist(String value) {
        List<Object> options = getEntityManager().createNamedQuery("AppUsers.findByEmail").setParameter('email', value).getResultList();
        return !options.isEmpty();
    }

너무 귀찮아서getSingleResult()를 두다

던지기:

  1. No Result Exception - 결과가 없는 경우
  2. NonUniqueResultException - 여러 결과 및 문서에서 더 많은 정보를 얻을 수 있는 기타 예외가 있는 경우

새로운 JPA 기능을 사용할 수 있다면 @Serafins의 답변을 선호합니다만, 이것은 매우 간단한 방법 중 하나입니다.여기서는 지금까지 언급되지 않았습니다.

    try {
        return (Profile) query.getSingleResult();
    } catch (NoResultException ignore) {
        return null;
    }
            `public Example validate(String param1) {
                // TODO Auto-generated method stub

                Example example = new Example();
                
                Query query =null;
                Object[] myResult =null;
                
                try {

                      query = sessionFactory.getCurrentSession()
                      .createQuery("select column from table where 
                      column=:p_param1");
                      query.setParameter("p_param1",param1);
                  }
                
                        myResult = (Object[])query.getSingleResult();//As your problem occurs here where the query has no records it is throwing an exception
                    
                        String obj1 = (String) myResult[0];
                        String obj2 = (String) myResult[1];
                        
                        

예.setobj1(ISSutil.convertNullToSpace(obj1))의 예를 나타냅니다.setobj2(ISSutil.convert Null ToSpace(obj2));

                return example;
                
                }catch(Exception e) {
                    e.printStackTrace();
                      
                 example.setobj1(ISSUtil.convertNullToSpace(""));//setting 
                 objects to "" in exception block
                 example.setobj1(ISSUtil.convertNullToSpace(""));
                }
                return example;
            }`

답변: 레코드 getsleresult가 없는 경우 예외 블록에서 객체를 "/empty JSON 객체가 "/empty"로 설정하는 예외 입력에도 불구하고 예외 블록에서 객체를 ""로 설정하여 처리한 예외가 발생합니다.이것은 완벽한 답변이 아니길 바랍니다.그러나 코드를 보다 정확하게 수정하고 항상 수정해야 할 필요가 있는 경우 도움이 될 수 있습니다.와라.

그건 나한테 효과가 있어.

Optional<Object> opt = Optional.ofNullable(nativeQuery.getSingleResult());
return opt.isPresent() ? opt.get() : null;

언급URL : https://stackoverflow.com/questions/2002993/jpa-getsingleresult-or-null

반응형