0

我正在尝试执行此查询,但在尝试实例化我的 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,在我的服务类中尝试调用 getPassageStatisticsForAllStations 并捕获并在那里处理异常还是进行 2 个查询?

感谢正手!

4

1 回答 1

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;
    }
}
于 2013-05-14T22:08:51.537 回答