Консультации по недвижимости для типа Консультация не найдены! Пройденный путь: консультант. Консультация - PullRequest
0 голосов
/ 30 октября 2018

Я работаю над приложением весенней загрузки. У меня есть следующие модели:

@Entity
@Table(name = "consultant")
public class Consultant {
    @Id
    @GeneratedValue(generator = "id_generator")
    @SequenceGenerator(
            name = "id_generator",
            sequenceName = "id_sequence",
            initialValue = 1
    )
    private Long consultant_id;
    @Column(nullable = false)
    private String consultant_first_name;
    @Column(nullable = false)
    private String consultant_last_name;
    @Column(nullable = false)
    private String consultant_phone;
    @Column(nullable = false)
    private String consultant_email;
    @Column(nullable = false)
    private String consultant_password;
    @Column(nullable = false)
    private boolean consultant_is_admin;
    @ManyToOne
    @JoinColumn(name = "consultancy_id", nullable = false)
    private Consultancy consultancy;

    public Consultant(){}

    public Consultant(String consultant_first_name, String consultant_last_name, String consultant_phone, String consultant_email, String consultant_password, boolean consultant_is_admin, Consultancy consultancy) {
        this.consultant_first_name = consultant_first_name;
        this.consultant_last_name = consultant_last_name;
        this.consultant_phone = consultant_phone;
        this.consultant_email = consultant_email;
        this.consultant_password = consultant_password;
        this.consultant_is_admin = consultant_is_admin;
        this.consultancy = consultancy;
    }

    public Long getConsultant_id() {
        return consultant_id;
    }

    public void setConsultant_id(Long consultant_id) {
        this.consultant_id = consultant_id;
    }

    public String getConsultant_first_name() {
        return consultant_first_name;
    }

    public void setConsultant_first_name(String consultant_first_name) {
        this.consultant_first_name = consultant_first_name;
    }

    public String getConsultant_last_name() {
        return consultant_last_name;
    }

    public void setConsultant_last_name(String consultant_last_name) {
        this.consultant_last_name = consultant_last_name;
    }

    public String getConsultant_phone() {
        return consultant_phone;
    }

    public void setConsultant_phone(String consultant_phone) {
        this.consultant_phone = consultant_phone;
    }

    public String getConsultant_email() {
        return consultant_email;
    }

    public void setConsultant_email(String consultant_email) {
        this.consultant_email = consultant_email;
    }

    public String getConsultant_password() {
        return consultant_password;
    }

    public void setConsultant_password(String consultant_password) {
        this.consultant_password = consultant_password;
    }

    public boolean isConsultant_is_admin() {
        return consultant_is_admin;
    }

    public void setConsultant_is_admin(boolean consultant_is_admin) {
        this.consultant_is_admin = consultant_is_admin;
    }

    public Consultancy getConsultancy() {
        return consultancy;
    }

    public void setConsultancy(Consultancy consultancy) {
        this.consultancy = consultancy;
    }
}

А

@Entity
@Table(name="consultancy")
public class Consultancy {
    @Id
    @GeneratedValue(generator = "id_generator")
    @SequenceGenerator(
            name = "id_generator",
            sequenceName = "id_sequence",
            initialValue = 1
    )
    @Column(nullable = false)
    private Long consultancy_id;
    @Column(nullable = false)
    private String consultancy_name;
    @Column(unique = true, nullable = false)
    private String consultancy_email;
    @Column(nullable = false)
    private String consultancy_phone;
    @Column(nullable = false)
    private String consultancy_website;
    @Column(nullable = false)
    private String consultancy_address;



    public Consultancy() {
    }

    public Consultancy(String consultancy_name, String consultancy_email, String consultancy_phone, String consultancy_website, String consultancy_address) {
        this.consultancy_name = consultancy_name;
        this.consultancy_email = consultancy_email;
        this.consultancy_phone = consultancy_phone;
        this.consultancy_website = consultancy_website;
        this.consultancy_address = consultancy_address;
    }

    public Long getConsultancy_id() {
        return consultancy_id;
    }

    public void setConsultancy_id(Long consultancy_id) {
        this.consultancy_id = consultancy_id;
    }

    public String getConsultancy_name() {
        return consultancy_name;
    }

    public void setConsultancy_name(String consultancy_name) {
        this.consultancy_name = consultancy_name;
    }

    public String getConsultancy_email() {
        return consultancy_email;
    }

    public void setConsultancy_email(String consultancy_email) {
        this.consultancy_email = consultancy_email;
    }

    public String getConsultancy_phone() {
        return consultancy_phone;
    }

    public void setConsultancy_phone(String consultancy_phone) {
        this.consultancy_phone = consultancy_phone;
    }

    public String getConsultancy_website() {
        return consultancy_website;
    }

    public void setConsultancy_website(String consultancy_website) {
        this.consultancy_website = consultancy_website;
    }

    public String getConsultancy_address() {
        return consultancy_address;
    }

    public void setConsultancy_address(String consultancy_address) {
        this.consultancy_address = consultancy_address;
    }
}

Я хочу получить consultants с конкретным consultancy_id. У меня есть JpaRepository следующим образом:

public interface ConsultantRepository extends JpaRepository<Consultant, Long> {

    public List<Consultant> findAllByConsultancy_Consultancy_id(Long id);

}

Когда я запускаю приложение, оно выдает следующую ошибку:

Caused by: 
org.springframework.data.mapping.PropertyReferenceException: No property consultancy found for type Consultancy! Traversed path: Consultant.consultancy.
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:94) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:358) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:334) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:318) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:290) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330) ~[na:na]
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:269) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:252) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:81) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.repository.query.parser.PartTree$OrPart.lambda$new$0(PartTree.java:250) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na]
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:251) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.repository.query.parser.PartTree$Predicate.lambda$new$0(PartTree.java:380) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na]
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:381) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:96) ~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:76) ~[spring-data-jpa-2.0.10.RELEASE.jar:2.0.10.RELEASE]
    ... 68 common frames omitted

Как я могу сопоставить с consultancy_id без необходимости писать весь запрос? Я мог бы сделать 2 вызова, один, чтобы получить консультацию из ID, а затем передать консультацию в параметре функции JPA, но я хочу сделать это за один вызов в базу данных. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Ваша конечная цель - найти всех консультантов, связанных с конкретной консультацией. Это отношения OneToMany со стороны консультанта и отношения OneToOne со стороны консультанта, предполагающие, что конкретный консультант может быть связан с одним консультантом в данный момент времени. Для этого есть две вещи.

  1. Во-первых, вы должны исправить соглашения JPA Spring Data для поля consultancy_id. Я сделал это, назвав поле consultancyId и используя имя @Column - см. Ниже.
  2. Далее необходимо правильно настроить отношения JPA в ваших сущностях. Вы можете или не можете использовать подход к объединению таблиц, но я так и сделал.

Сущность Consultancy:

@Entity
@Table(name="consultancy")
public class Consultancy {
    @Id
    @GeneratedValue(generator = "id_generator")
    @SequenceGenerator(
            name = "id_generator",
            sequenceName = "id_sequence",
            initialValue = 1
    )
    @Column(name= "consultancy_id", nullable = false)
    private Long consultancyId;

    @Column(nullable = false)
    private String consultancy_name;
    @Column(unique = true, nullable = false)
    private String consultancy_email;
    @Column(nullable = false)
    private String consultancy_phone;
    @Column(nullable = false)
    private String consultancy_website;
    @Column(nullable = false)
    private String consultancy_address;


    @OneToMany(targetEntity = Consultant.class, fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
    @JoinTable(name = "consultant_consultancy_join_table",
            joinColumns = @JoinColumn(name = "consultancy_id"),
            inverseJoinColumns = @JoinColumn(name = "consultant_id"))
    @Fetch(value = FetchMode.SUBSELECT)
    private Collection<Consultant> consultants;


    public Consultancy() {
    }

    public Consultancy(String consultancy_name, String consultancy_email, String consultancy_phone, String consultancy_website, String consultancy_address) {
        this.consultancy_name = consultancy_name;
        this.consultancy_email = consultancy_email;
        this.consultancy_phone = consultancy_phone;
        this.consultancy_website = consultancy_website;
        this.consultancy_address = consultancy_address;
    }

    public Long getConsultancyId() {
        return consultancyId;
    }

    public void setConsultancyId(Long consultancyId) {
        this.consultancyId = consultancyId;
    }

    public String getConsultancy_name() {
        return consultancy_name;
    }

    public void setConsultancy_name(String consultancy_name) {
        this.consultancy_name = consultancy_name;
    }

    public String getConsultancy_email() {
        return consultancy_email;
    }

    public void setConsultancy_email(String consultancy_email) {
        this.consultancy_email = consultancy_email;
    }

    public String getConsultancy_phone() {
        return consultancy_phone;
    }

    public void setConsultancy_phone(String consultancy_phone) {
        this.consultancy_phone = consultancy_phone;
    }

    public String getConsultancy_website() {
        return consultancy_website;
    }

    public void setConsultancy_website(String consultancy_website) {
        this.consultancy_website = consultancy_website;
    }

    public String getConsultancy_address() {
        return consultancy_address;
    }

    public void setConsultancy_address(String consultancy_address) {
        this.consultancy_address = consultancy_address;
    }

    public Collection<Consultant> getConsultants() {
        return consultants;
    }

    public void setConsultants(Collection<Consultant> consultants) {
        this.consultants = consultants;
    }
}

Consultant сущность:

@Entity
@Table(name = "consultant")
public class Consultant {
    @Id
    @GeneratedValue(generator = "id_generator")
    @SequenceGenerator(
            name = "id_generator",
            sequenceName = "id_sequence",
            initialValue = 1
    )
    private Long consultant_id;

    @Column(nullable = false)
    private String consultant_first_name;
    @Column(nullable = false)
    private String consultant_last_name;
    @Column(nullable = false)
    private String consultant_phone;
    @Column(nullable = false)
    private String consultant_email;
    @Column(nullable = false)
    private String consultant_password;
    @Column(nullable = false)
    private boolean consultant_is_admin;

    @OneToOne(targetEntity = Consultancy.class, fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
    @JoinTable(name = "consultant_consultancy_join_table",
            joinColumns = @JoinColumn(name = "consultant_id"),
            inverseJoinColumns = @JoinColumn(name = "consultancy_id"))
    private Consultancy consultancy;

    public Consultant(){}

    public Consultant(String consultant_first_name, String consultant_last_name, String consultant_phone, String consultant_email, String consultant_password, boolean consultant_is_admin, Consultancy consultancy) {
        this.consultant_first_name = consultant_first_name;
        this.consultant_last_name = consultant_last_name;
        this.consultant_phone = consultant_phone;
        this.consultant_email = consultant_email;
        this.consultant_password = consultant_password;
        this.consultant_is_admin = consultant_is_admin;
        this.consultancy = consultancy;
    }

    public Long getConsultant_id() {
        return consultant_id;
    }

    public void setConsultant_id(Long consultant_id) {
        this.consultant_id = consultant_id;
    }

    public String getConsultant_first_name() {
        return consultant_first_name;
    }

    public void setConsultant_first_name(String consultant_first_name) {
        this.consultant_first_name = consultant_first_name;
    }

    public String getConsultant_last_name() {
        return consultant_last_name;
    }

    public void setConsultant_last_name(String consultant_last_name) {
        this.consultant_last_name = consultant_last_name;
    }

    public String getConsultant_phone() {
        return consultant_phone;
    }

    public void setConsultant_phone(String consultant_phone) {
        this.consultant_phone = consultant_phone;
    }

    public String getConsultant_email() {
        return consultant_email;
    }

    public void setConsultant_email(String consultant_email) {
        this.consultant_email = consultant_email;
    }

    public String getConsultant_password() {
        return consultant_password;
    }

    public void setConsultant_password(String consultant_password) {
        this.consultant_password = consultant_password;
    }

    public boolean isConsultant_is_admin() {
        return consultant_is_admin;
    }

    public void setConsultant_is_admin(boolean consultant_is_admin) {
        this.consultant_is_admin = consultant_is_admin;
    }

    public Consultancy getConsultancy() {
        return consultancy;
    }

    public void setConsultancy(Consultancy consultancy) {
        this.consultancy = consultancy;
    }
}

Схема базы данных (я использую диалект Derby, выберите подходящий для вашей БД):

-- Consultant table
create table consultant (
  consultant_id BIGINT GENERATED BY DEFAULT AS IDENTITY     NOT NULL PRIMARY KEY,
    consultant_first_name           VARCHAR(50) NOT NULL,
    consultant_last_name            VARCHAR(50) NOT NULL,
    consultant_phone                VARCHAR(50) NOT NULL,
    consultant_email                VARCHAR(50) NOT NULL,
    consultant_password             VARCHAR(50) NOT NULL,
    consultant_is_admin             boolean     NOT NULL DEFAULT false
);

-- Consultancy table
create table consultancy (
  consultancy_id BIGINT GENERATED BY DEFAULT AS IDENTITY     NOT NULL PRIMARY KEY,
    consultancy_name           VARCHAR(50) NOT NULL,
    consultancy_email            VARCHAR(50) NOT NULL,
    consultancy_phone                VARCHAR(50) NOT NULL,
    consultancy_website                VARCHAR(50) NOT NULL,
    consultancy_address             VARCHAR(50) NOT NULL
);

-- Join table
CREATE TABLE consultant_consultancy_join_table (
  consultant_id                    BIGINT                                       NOT NULL,
  consultancy_id                   BIGINT                                       NOT NULL,
  CONSTRAINT fk_consultant_id FOREIGN KEY (consultant_id) REFERENCES consultant(consultant_id),
  CONSTRAINT fk_consultancy_id FOREIGN KEY (consultancy_id) REFERENCES consultancy (consultancy_id)
); 

Некоторые данные испытаний:

insert into consultant (consultant_first_name, consultant_last_name, consultant_phone, consultant_email, consultant_password, consultant_is_admin) values
('John', 'Doe', '210-917-6789', 'john.doe@acme.com', 'work2eat', true),
('Jane', 'Doe', '210-867-7635', 'jane.doe@acme.com', 'work2eat', true);

insert into consultancy (consultancy_name, consultancy_email, consultancy_phone, consultancy_website, consultancy_address) values
('Acme Consultancy', 'info@acme.com', '210-902-8956', 'www.acme.com', '9910, Any Street, San Antonio, TX, 78210');

insert into consultant_consultancy_join_table(consultant_id, consultancy_id) values
(1,1),
(2,1);

Класс ConsultancyRepository:

public interface ConsultancyRepository extends CrudRepository<Consultancy, Long> {

    Consultancy findByConsultancyId (Long consultancyId);
}

A JUnit Контрольный пример:

public class ConsultancyRepositoryTest {

    @Autowired
    private ConsultancyRepository consultancyRepository;

    @Test
    public void testGetAllConsultants() {
        Consultancy consultancy = consultancyRepository.findByConsultancyId(1L);
        assertNotNull(consultancy);
        assertEquals(2, consultancy.getConsultants().size());
    }
}
0 голосов
/ 30 октября 2018

Вот проблема.

public List<Consultant> findAllByConsultancy_Consultancy_id(Long id);

В соответствии с данными jpa Spring, если вы хотите найти по свойству, то это свойство должно присутствовать в вашем классе сущности.

Так что здесь findAllByConsultancy_Consultancy_id в этом методе JPA обрабатывает Consultancy_Consultancy_id как поле, но его нет, поэтому выдает ошибку.

Измените свой метод на

public List<Consultant> findAllByConsultancy_id(Long id);

и check.it должен работать.

ПРИМЕЧАНИЕ. Всегда соблюдайте стандарты и старайтесь избегать использования consultant_first_name, но вместо этого используйте consultantFirstName.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...