我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
但getSingleResult扔了一个Exception.
谢谢
cle*_*tus 247
抛出异常就是getSingleResult()指示无法找到它.我个人无法忍受这种API.它强制虚假的异常处理没有真正的好处.您只需将代码包装在try-catch块中即可.
或者,您可以查询列表并查看其是否为空.这不会引发异常.实际上,因为你没有在技术上进行主键查找,所以可能会有多个结果(即使一个,两个或外键或约束的组合使得这在实践中不可能),所以这可能是更合适的解决方案.
Eug*_*atz 32
我在以下帮助器方法中封装了逻辑.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 23
这是一个很好的选择:
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);
}
Run Code Online (Sandbox Code Playgroud)
小智 21
在Java 8中尝试这个:
Optional first = query.getResultList().stream().findFirst();
Run Code Online (Sandbox Code Playgroud)
hee*_*nee 16
Spring有一个实用方法:
TypedQuery<Profile> query = em.createNamedQuery(namedQuery, Profile.class);
...
return org.springframework.dao.support.DataAccessUtils.singleResult(query.getResultList());
Run Code Online (Sandbox Code Playgroud)
Ser*_*ins 16
从 JPA 2.2 开始,.getResultList()您可以返回流并获取第一个元素,而不是检查列表是否为空或创建流。
.getResultStream()
.findFirst()
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
小智 10
我已经完成了(在Java 8中):
query.getResultList().stream().findFirst().orElse(null);
Run Code Online (Sandbox Code Playgroud)
如果你想使用try/catch机制来处理这个问题..那么它可以用来像if/else一样.当我找不到现有记录时,我使用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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个基于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);
}
Run Code Online (Sandbox Code Playgroud)
有一种我建议的替代方法:
Query query = em.createQuery("your query");
List<Element> elementList = query.getResultList();
return CollectionUtils.isEmpty(elementList ) ? null : elementList.get(0);
Run Code Online (Sandbox Code Playgroud)
这可以防止出现空指针异常,并确保仅返回1个结果。
| 归档时间: |
|
| 查看次数: |
191478 次 |
| 最近记录: |