如果表只包含null,如何使用构造函数实例化一个对象?

时间:2013-05-14 21:54:29

标签: java jpa jpql

即时尝试执行此查询,但在尝试实例化我的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次查询吗?

感谢正手!

1 个答案:

答案 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;
    }
}