JpaRepository со сложным классом ключей не проходит проверку с ошибкой «Проверка не выполнена для запроса метода» при использовании синтаксиса JPA - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь использовать положительные качества JPA и получать данные из БД в объект. Он отлично работает, когда JpaRepository использует простой класс в качестве ключа, но для тестовых случаев, когда класс ключа немного сложен, проверка jpa не выполняется даже для самых простых запросов.

использование native_query = true решит проблему, однако я не уверен, что делаю неправильно и чего мне не хватает.

MyTestPK.java:

package com.mytest.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Embeddable;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class MyTestPK implements Serializable {
    private String type;
    private String name;
}


MyTest.java:

package com.mytest.model;

import lombok.Data;

import javax.persistence.*;

@Entity
@Table(name = "my_test")

@Data
@IdClass(MyTestPK.class)
public class MyTest {
    @Id
    @Column(name = "my_test_type", nullable = false)
    private String type;

    @Id
    @Column(name = "my_test_name", nullable = false)
    private String name;

    @Column(name = "my_test_misc")
    private String misc;
}

MyTestRepository.java:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface MyTestRepository extends JpaRepository<MyTest, MyTestPK> {
    @Query(value="SELECT m FROM MyTest m")
    List<MyTest> getAllObjs();
}

Получение следующей ошибки: .... Ошибка вызова метода init; вложенным исключением является java.lang.IllegalArgumentException: проверка не удалась для запроса для метода public abstract java.util.List com.mytest.dao.MyTestRepository.getAllObjs ()! at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor.java:586) ~ [spring-beans-5.0.9.RELEASE.jar: 5.0.9]. RELE в org.springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.java:90) ~ [spring-beans-5.0.9.RELEASE.jar: 5.0.9.RELEASE]

1 Ответ

0 голосов
/ 18 июня 2019

Вы можете использовать @EmbeddedId, и вам не нужно снова определять столбцы в классах сущностей.

MyTestPK.java:

package com.mytest.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Embeddable;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class MyTestPK implements Serializable {
    @Column(name = "my_test_type", nullable = false)
    private String type;
    @Column(name = "my_test_name", nullable = false)
    private String name;
}

MyTest.java:

package com.mytest.model;

import lombok.Data;

import javax.persistence.*;

@Entity
@Table(name = "my_test")
@Data
public class MyTest {
    @EmbeddedId
    private MyTestPK pk;

    @Column(name = "my_test_misc")
    private String misc;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...