2

実装として休止状態で JPA を使用しています。次の DTO があるとします。

public class SupplierInfoDto{
   private String supplierName;
   private BigDecimal remainingFinances;

   public SupplierInfoDto(String supplierName, BigDecimal remainingFinances){
       this.supplierName = supplierName;
       this.remainingFinances = remainingFinances;
   }

   // getters / setters
}

このコンストラクターを適切に見つけるために休止状態にできないようです。最初に次のクエリを試してみました (モデルはこれよりも複雑で、最終的に (エンティティで直接ではなく) いくつかの集計をフェッチする必要があるため、エンティティではなく DTO をフェッチしています):

SELECT NEW com.company.dto.SupplierInfoDto(s.name, f.remaining)
FROM Supplier s INNER JOIN Finances f
WHERE s.id = :SupplierId

ただし、 org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class例外があります。

私が選択しているremaining列は、MSSQL に float として格納されています (お金を float として格納してはならないことはわかっていますが、これは既存のシステムであり、このデータ型を変更することはできません)。

テストとして、次のクエリを試しましたが、上記と同じ例外があります。

SELECT NEW com.company.dto.SupplierInfoDto(s.name, NEW java.math.BigDecimal(10))
FROM Supplier s
WHERE s.id = :SupplierId

私の質問は次のとおりです。休止状態/JPAに上記の2つのクエリに適したコンストラクターを見つけるにはどうすればよいですか?

更新:プロパティは、Finances エンティティで double 型です(remaining私の決定ではありません)。

4

4 に答える 4

5

BigDecimal ctor が認識されない理由はわかりませんが、コンストラクターをオーバーロードできます

もしあなたが持っていたら

public SupplierInfoDto(String s, Double d) {
   this(s, new BigDecimal(String.valueOf(d)));
}

public SupplierInfoDto(String s, BigDecimal bd) {
   //set fields
}

BigDecimal double コンストラクターを使用する場合、数値は double に基づいているため、丸めエラーが発生する可能性があります。通常、BigDecimal 文字列 contstrctor を使用するのが最善です

例えば

new BigDecimal("0.1")

よりも正確です

new BigDecimal(0.1d)

この記事では、これについて説明します

于 2012-10-05T09:00:22.277 に答える
0

java.lang.Number をコンストラクタ パラメータとして使用し、パラメータの .floatValue() / doubleValue() に基づいて BigDecimal フィールドを作成しないのはなぜですか。

于 2012-10-05T18:59:23.457 に答える
0
class named X  with a constructor that takes two parameters. The types of the parameters from the SELECT clause must match the signature defined in the class.

Syntax for the SELECT clause:

select_clause ::= SELECT [DISTINCT] select_expression
    {, select_expression}*
    select_expression ::=
    single_valued_path_expression |
    aggregate_expression |
    identification_variable |
    OBJECT(identification_variable) |
    constructor_expression
    constructor_expression ::=
    NEW constructor_name ( constructor_item {, constructor_item}* )
    constructor_item ::= single_valued_path_expression |
    aggregate_expression
    aggregate_expression ::=
    { AVG | MAX | MIN | SUM }
    ([DISTINCT] state_field_path_expression) |
    COUNT ([DISTINCT] identification_variable |
    state_field_path_expression |
    single_valued_association_path_expression)
于 2012-10-05T08:56:14.907 に答える