即时尝试执行此查询,但在尝试实例化我的PassageStatistics对象时获取IllegalArgumentException,该对象在其构造函数中使用长参数,当表为空(仅包含空值)时,这里是存储库类中的查询方法:
@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中调用getPassageStatisticsForAllStations并捕获我的服务类并在那里处理异常或进行2次查询吗?
感谢正手!
答案 0 :(得分:2)
如果您需要在构造函数中接受null作为有效值,那么参数的类型必须是对象,这意味着您的问题的答案是肯定的,您应该使用(Long, Long)
。
正如评论中指出的那样,如果在构造函数中传递的值为null,那么在bean中指定一个默认值是合理的。像这样的东西会起作用:
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;
}
}