Java 如果表中只包含null,如何使用花费很长时间的构造函数实例化对象?
我正在尝试执行此查询,但在尝试实例化PassageStatistics对象(该对象在其构造函数中采用长参数)时,如果表为空(仅包含空值),则会得到IllegalArgumentException,存储库类中的查询方法如下:Java 如果表中只包含null,如何使用花费很长时间的构造函数实例化对象?,java,jpa,jpql,Java,Jpa,Jpql,我正在尝试执行此查询,但在尝试实例化PassageStatistics对象(该对象在其构造函数中采用长参数)时,如果表为空(仅包含空值),则会得到IllegalArgumentException,存储库类中的查询方法如下: @SuppressWarnings("unchecked") @Override public PassageStatistics getPassageStatisticsForAllStations() { Query query = em
@SuppressWarnings("unchecked")
@Override
public PassageStatistics getPassageStatisticsForAllStations() {
Query query =
em.createQuery("SELECT NEW com.henrikpetersson.cartoll.tolldomain.domain.PassageStatistics(count(p), sum(price)) from Passage p");
return (PassageStatistics) query.getSingleResult();
}
这是PassageStatistics的目标:
public class PassageStatistics {
private long passageCount;
private long revenue;
public PassageStatistics(long passageCount, long revenue) {
this.passageCount = passageCount;
this.revenue = revenue;
}
public PassageStatistics() {}
}
什么是最佳实践?我应该在我的服务类中使用包装器Long,在try-and-catch中调用getPassageStatisticsForAllStations并在那里处理异常,还是进行两次查询
谢谢你的正手 如果要求在构造函数中接受null作为有效值,那么参数的类型必须是objects,这意味着问题的答案是yes,您应该使用
(Long,Long)
正如在注释中指出的,在bean中指定一个默认值是合理的,如果在构造函数中传递的值为null,您将使用该值。类似这样的方法会奏效:
public class PassageStatistics {
private static final Long DEFAULT_PASSAGE_COUNT = 0;
private static final Long DEFAULT_REVENUE = 0;
private long passageCount;
private long revenue;
public PassageStatistics(Long passageCount, Long revenue) {
this.passageCount = passageCount == null ? DEFAULT_PASSAGE_COUNT : passageCount;
this.revenue = revenue == null ? DEFAULT_REVENUE : revenue;
}
}
@Henrik这是一个很好的答案,但不要使用try/catch,只需检查
==null
,并将0
设置为字段的值+1.谢谢。:)顺便说一句,“?”是什么意思??(我是一名学生)。@Henrik这是我的演讲