2

テーブルから最大コードを選択しましたが、データがある場合は機能しますが、テーブルが空の場合は次のようなエラーが発生しました:

リポジトリ内のコードは次のとおりです。

@Repository("depositRepository")
public interface DepositRepository  extends JpaRepository<Deposit,Integer>,
   JpaSpecificationExecutor<Deposit> {  
    @Query("select max(u.code) from Deposit u")
    String getMaxCode();


}

そして、結果を得るためにサービスで呼び出すコードは次のとおりです。

String maxCode=depositRepo.getMaxCode();

以下で述べたように、エラーが発生しました。

Hibernate: 
    select
        max(deposit0_.code) as col_0_0_ 
    from
        rems.tbldeposit deposit0_
20:10:55,182  ERROR [rems.controller.DepositController] java.lang.NullPointerException
4

1 に答える 1

8

空のレコード セットから max() を選択すると、DBMS は null を返します。

サービス メソッドからさらに多くのコード コンテキストを見ずに判断するのは難しいですが、後で getMaxCode() の結果に対して maxCode.equals(...) や maxCode.toString() などの操作を呼び出していると思います。 NullPointerException を返します。

例外を回避するには、Java コードで null チェックを実行します。

String maxCode=depositRepo.getMaxCode();
maxCode = (maxCode==null) ? "0" : maxCode;

または、次のように、イベント max(u.code) が null の場合にデフォルト値を返すようにクエリを微調整できます。

@Query("select coalesce(max(u.code), '0') from Deposit u")
于 2013-09-30T19:42:39.877 に答える