Spring CriteriaBuilder列挙型を名前で検索

ダニエルタウブ:

SpecificationDBでを使用して彼の名前で列挙型を検索しようとするとSpring @Repository、次の例外が発生します。

Caused by: java.lang.IllegalArgumentException: Parameter value [HELLO] did not match expected type [application.springEnum.Hello (n/a)]

しかし、DBで保存された列挙型VARCHAR(255)String、なぜで列挙型を検索できるのか、なぜ列挙型である必要があるのですか?

DTOクラス

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DTO {
    @Id
    private String id;
    @Enumerated(EnumType.STRING)
    private Hello helloEnum; // My Enum
}

データベースコネクタ

@Repository
public interface Connector extends JpaRepository<DTO, String>, JpaSpecificationExecutor<DTO> {
}

スターター

@Component
public class Starter {
    @Autowired
    private Connector connector;

    @PostConstruct
    public void init(){
        // Create DTO entity
        DTO dto = DTO.builder()
                .id(UUID.randomUUID().toString())
                .helloEnum(Hello.HELLO)
                .build();
        // Save the entity in the db
        connector.save(dto);

        // Search by the name, here I get the excpetion
        List<DTO> result = connector.findAll((root, query, cb) ->
                cb.equal(root.get("helloEnum"), "HELLO")
        );
    }
}

説明をお願いします。

J-Alex:

あなたは比較しようとしているEnumString

この方法を試してください:

List<DTO> result = connector.findAll((root, query, cb) ->
                cb.equal(root.get("helloEnum"), Hello.HELLO);

これがなぜ起こっているのか、いくつかの説明を提供しようと思います。Hibernateはを使用ResultSetしてデータベースからClass署名にフェッチReflectionます。

スタックトレースを観察すると、次のようなものが表示されます。

org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:54)〜[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.query.spi.QueryParameterBindingValidator.validate (QueryParameterBindingValidator.java:27)〜[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.query.internal.QueryParameterBindingImpl.validate(QueryParameterBindingImpl.java:90)〜[hibernate- core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.query.internal.QueryParameterBindingImpl.setBindValue(QueryParameterBindingImpl.java:55)〜[hibernate-core-5.2.16.Final.jar:5.2 .16.Final] at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:486)〜[hibernate-core-5.2.16.Final.jar:5.2.16.Final] org.hibernate.query .internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:104)〜[hibernate-core-5.2.16.Final.jar:5.2.16.Final]

Hibernateはパラメーターを設定する前に一連の検証を実行します。

の根本原因を初期化する最後のメソッドはException次のとおりです

public <P> void validate(Type paramType, Object bind, TemporalType temporalType) {
        if ( bind == null || paramType == null ) {
            // nothing we can check
            return;
        }
        final Class parameterType = paramType.getReturnedClass();
        if ( parameterType == null ) {
            // nothing we can check
            return;
        }

        if ( Collection.class.isInstance( bind ) && !Collection.class.isAssignableFrom( parameterType ) ) {
            // we have a collection passed in where we are expecting a non-collection.
            //      NOTE : this can happen in Hibernate's notion of "parameter list" binding
            //      NOTE2 : the case of a collection value and an expected collection (if that can even happen)
            //          will fall through to the main check.
            validateCollectionValuedParameterBinding( parameterType, (Collection) bind, temporalType );
        }
        else if ( bind.getClass().isArray() ) {
            validateArrayValuedParameterBinding( parameterType, bind, temporalType );
        }
        else {
            if ( !isValidBindValue( parameterType, bind, temporalType ) ) {
                throw new IllegalArgumentException(
                        String.format(
                                "Parameter value [%s] did not match expected type [%s (%s)]",
                                bind,
                                parameterType.getName(),
                                extractName( temporalType )
                        )
                );
            }
        }
    }

予想されるタイプはであり、チェックする値はであるので、private static boolean isValidBindValue(Class expectedType, Object value, TemporalType temporalType)チェックの束を持つメソッドはですがタイプと互換性がありません!falseclass com.whatever.HelloHELLOStringEnumString

Enum検索条件に適切な値を指定すると、合格するチェックがprivate static boolean isValidBindValue(Class expectedType, Object value, TemporalType temporalType)含まれているため、検証が合格しますisInstance

else if ( expectedType.isInstance( value ) ) {
    return true;
}

すべてのチェックの後、Hibernateはから値を抽出してResultSetを構築します。Listこの場合、Listリフレクションを使用しての要素がフェッチされます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spring DataJPA-列挙型で最初に検索し、日付で並べ替えます

分類Dev

Spring Bootで列挙型の適切な検証エラーを返す方法は?

分類Dev

Spring Swagger、列挙型定数を非表示

分類Dev

列挙型で値を検索する

分類Dev

列挙型とSpringの@RequestParam

分類Dev

列挙型とSpringの@RequestParam

分類Dev

MongoDBとSpringデータ-名/姓でユーザーを検索

分類Dev

列挙型のSpringデータメソッド名

分類Dev

Spring Boot 2でZipkin列挙型をバインドできません

分類Dev

列挙型で文字列を検索し、列挙型を返します

分類Dev

Spring BootJPA-2列で検索

分類Dev

Spring BootとCassandraで列挙型を序数として永続化する方法は?

分類Dev

Java Spring Frameworkで文字列LIKE 'something%'を検索する方法は?

分類Dev

MongoDB、JAVA Springで複数の列を使用して検索

分類Dev

Spring BootCrudRepositoryで配列を検索する方法

分類Dev

Springを使用して列挙型の値を取得する方法

分類Dev

javascript列挙型を検索する

分類Dev

列挙型のparamに応じてのSpring Beanを選択

分類Dev

Javaを使用して列挙型でSpring Bootで親子Json応答を作成する方法

分類Dev

列挙型の名前を出力する

分類Dev

列挙型の名前を使用する

分類Dev

Spring BootJPAでの列挙型と時間型のマッピング

分類Dev

リポジトリクエリで列挙型を使用できません(neo4j / Spring Data)

分類Dev

SpringのLdapTemplate検索:PartialResultException:未処理の継続参照。残りの名前 '/'

分類Dev

SpringのLdapTemplate検索:PartialResultException:未処理の継続参照。残りの名前 '/'

分類Dev

Spring JPA Hibernateの配列列の検索方法には、クエリという名前の特定の要素が含まれています

分類Dev

Springを使用して列挙型の値をプロパティに注入する

分類Dev

spring-data-elasticsearchを使用してJava列挙型を保存する方法

分類Dev

値ではなく列挙型の名前で配列を並べ替える

Related 関連記事

  1. 1

    Spring DataJPA-列挙型で最初に検索し、日付で並べ替えます

  2. 2

    Spring Bootで列挙型の適切な検証エラーを返す方法は?

  3. 3

    Spring Swagger、列挙型定数を非表示

  4. 4

    列挙型で値を検索する

  5. 5

    列挙型とSpringの@RequestParam

  6. 6

    列挙型とSpringの@RequestParam

  7. 7

    MongoDBとSpringデータ-名/姓でユーザーを検索

  8. 8

    列挙型のSpringデータメソッド名

  9. 9

    Spring Boot 2でZipkin列挙型をバインドできません

  10. 10

    列挙型で文字列を検索し、列挙型を返します

  11. 11

    Spring BootJPA-2列で検索

  12. 12

    Spring BootとCassandraで列挙型を序数として永続化する方法は?

  13. 13

    Java Spring Frameworkで文字列LIKE 'something%'を検索する方法は?

  14. 14

    MongoDB、JAVA Springで複数の列を使用して検索

  15. 15

    Spring BootCrudRepositoryで配列を検索する方法

  16. 16

    Springを使用して列挙型の値を取得する方法

  17. 17

    javascript列挙型を検索する

  18. 18

    列挙型のparamに応じてのSpring Beanを選択

  19. 19

    Javaを使用して列挙型でSpring Bootで親子Json応答を作成する方法

  20. 20

    列挙型の名前を出力する

  21. 21

    列挙型の名前を使用する

  22. 22

    Spring BootJPAでの列挙型と時間型のマッピング

  23. 23

    リポジトリクエリで列挙型を使用できません(neo4j / Spring Data)

  24. 24

    SpringのLdapTemplate検索:PartialResultException:未処理の継続参照。残りの名前 '/'

  25. 25

    SpringのLdapTemplate検索:PartialResultException:未処理の継続参照。残りの名前 '/'

  26. 26

    Spring JPA Hibernateの配列列の検索方法には、クエリという名前の特定の要素が含まれています

  27. 27

    Springを使用して列挙型の値をプロパティに注入する

  28. 28

    spring-data-elasticsearchを使用してJava列挙型を保存する方法

  29. 29

    値ではなく列挙型の名前で配列を並べ替える

ホットタグ

アーカイブ