JPA getSingleResult() 또는 늘
는 i i나 an an an i i i i i i i 。insertOrUpdate
Entity
존재하지 않는 경우 갱신하거나 존재하지 않는 경우 갱신합니다.하게 하려면 , 「」를 사용할 가 있습니다.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;
}
getSingleResult
Exception
감사해요.
예외를 두는 것은 찾을 수 없다는 것을 나타냅니다.개인적으로 이런 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개의 결과만 반환됩니다.
그러니 그러지 마세요!
두 가지 옵션이 있습니다.
선택 항목을 실행하여 결과 세트의 COUNT를 가져오고 이 카운트가 0이 아닌 경우에만 데이터를 가져옵니다.
다른 종류의 쿼리(결과 세트를 가져오는 쿼리)를 사용하여 결과가 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()
를 두다
던지기:
- No Result Exception - 결과가 없는 경우
- 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
'IT' 카테고리의 다른 글
MySQL 뷰에 데이터를 삽입할 수 있습니까? (0) | 2022.10.29 |
---|---|
여러 개의 컬럼과 제한 2로 그룹화하시겠습니까? (0) | 2022.10.28 |
pylab과 pyplot의 차이점은 무엇입니까? (0) | 2022.10.28 |
스위치가 다음과 같은 경우보다 빠른 이유 (0) | 2022.10.28 |
오류 "1038 메모리가 부족합니다. 정렬 버퍼 크기를 늘리는 것을 고려하십시오. (0) | 2022.10.28 |