找不到咨询类型的房地产咨询!遍历路径:Consultant.consultancy



我正在开发一个spring-boot应用程序。我有以下型号:

@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;
}
}

我想要获得具有特定consultancy_idconsultants。我的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?我可以进行两次调用,一次是从ID获取咨询,然后在JPA函数参数中传递咨询,但我想在对数据库的一次调用中完成。请帮忙。

您的最终目标是检索与特定咨询相关的所有顾问。这是咨询方的OneToMany关系,也是咨询方的一对一关系,假设特定顾问可以在给定时间点与单个咨询公司关联。实现这一目标需要两件事。

  1. 首先,您应该修复consultancy_id字段的Spring Data JPA约定。我通过将字段命名为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;
}
}

数据库模式(我使用的是德比方言,请为您的数据库选择合适的方言(:

-- 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);
}

JUnit测试用例:

public class ConsultancyRepositoryTest {
@Autowired
private ConsultancyRepository consultancyRepository;
@Test
public void testGetAllConsultants() {
Consultancy consultancy = consultancyRepository.findByConsultancyId(1L);
assertNotNull(consultancy);
assertEquals(2, consultancy.getConsultants().size());
}
}

这是问题所在。

public List<Consultant> findAllByConsultancy_Consultancy_id(Long id);

根据Spring数据jpa,如果您想按属性查找,那么该属性应该存在于实体类中。

因此,在这个方法中,findAllByConsultancy_Consultancy_idJPA将Consultancy_Consultancy_id视为一个字段,但它不存在,因此它给出了错误。

将您的方法更改为

public List<Consultant> findAllByConsultancy_id(Long id);

然后检查。这应该有效。

注意:始终保持标准,尽量避免使用consultant_first_name,而是使用consultantFirstName

希望能有所帮助。

最新更新