Spring boot 未找到类型咨询的属性咨询!穿越路径:Consultant.consultancy

Spring boot 未找到类型咨询的属性咨询!穿越路径:Consultant.consultancy,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我正在开发一个spring启动应用程序。我有以下型号: @Entity @Table(name = "consultant") public class Consultant { @Id @GeneratedValue(generator = "id_generator") @SequenceGenerator( name = "id_generator", sequenceName = "id_sequence",

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

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

我想获得具有特定咨询id的咨询师。我的J假设如下:

public interface ConsultantRepository extends JpaRepository<Consultant, Long> {

    public List<Consultant> findAllByConsultancy_Consultancy_id(Long id);

}
public interface ConsultantRepository扩展了JpaRepository{
公共列表findAllByConsultancy\u Consultancy\u id(长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
由以下原因引起:
org.springframework.data.mapping.PropertyReferenceException:未找到类型咨询的属性咨询!穿越路径:Consultant.consultancy。
在org.springframework.data.mapping.PropertyPath.(PropertyPath.java:94)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:358)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:334)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:318)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:290)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330)~[na:na]
在org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:269)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:252)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.repository.query.parser.Part.(Part.java:81)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在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]
在java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)~[na:na]
在java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)~[na:na]
在java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)~[na:na]
在java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)~[na:na]
在java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)~[na:na]
在java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)~[na:na]
在java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)~[na:na]
在java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)~[na:na]
在org.springframework.data.repository.query.parser.PartTree$OrPart.(PartTree.java:251)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在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]
在java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)~[na:na]
在java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)~[na:na]
在java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)~[na:na]
在java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)~[na:na]
在java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)~[na:na]
在java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)~[na:na]
在java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)~[na:na]
在java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)~[na:na]
在org.springframework.data.repository.query.parser.PartTree$Predicate.(PartTree.java:381)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.repository.query.parser.PartTree.(PartTree.java:96)~[spring-data-commons-2.0.10.RELEASE.jar:2.0.10.RELEASE]
在org.springframework.data.jpa.repository.query.PartTreeJpaQuery.(PartTreeJpaQuery.java:76)~[spring-data-jpa-2.0.10.RELEASE.jar:2.0.10.RELEASE]
... 省略68个公共框架
我如何在不必编写整个查询的情况下使用查询id进行映射?我可以进行两次调用,一次是从ID获取咨询,然后在JPA函数参数中传递咨询,但我想在对数据库的一次调用中完成。请帮忙。

问题出在这里

public List<Consultant> findAllByConsultancy_Consultancy_id(Long id);
检查一下,应该能用

注意:始终保持标准,尽量避免使用
consultant\u first\u name
,而是使用
consultantFirstName


希望有帮助。

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

  • 首先,您应该修复
    id
    字段的Spring数据JPA约定。为此,我将字段命名为
    consultancyId
    ,并使用
    @列
    名称-见下文
  • 接下来,您需要在实体中正确设置JPA关系。您可以使用联接表方法,也可以不使用联接表方法,但我就是这样做的
  • 咨询公司实体:

    @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;
        }
    }
    
    @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;
        }
    }
    
    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);
    
    public interface ConsultancyRepository extends CrudRepository<Consultancy, Long> {
    
        Consultancy findByConsultancyId (Long consultancyId);
    }
    
    public class ConsultancyRepositoryTest {
    
        @Autowired
        private ConsultancyRepository consultancyRepository;
    
        @Test
        public void testGetAllConsultants() {
            Consultancy consultancy = consultancyRepository.findByConsultancyId(1L);
            assertNotNull(consultancy);
            assertEquals(2, consultancy.getConsultants().size());
        }
    }
    
    数据库模式(我使用的是Derby方言,请为您的数据库选择合适的模式):

    一些测试数据:

    @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;
        }
    }
    
    @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;
        }
    }
    
    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);
    
    public interface ConsultancyRepository extends CrudRepository<Consultancy, Long> {
    
        Consultancy findByConsultancyId (Long consultancyId);
    }
    
    public class ConsultancyRepositoryTest {
    
        @Autowired
        private ConsultancyRepository consultancyRepository;
    
        @Test
        public void testGetAllConsultants() {
            Consultancy consultancy = consultancyRepository.findByConsultancyId(1L);
            assertNotNull(consultancy);
            assertEquals(2, consultancy.getConsultants().size());
        }
    }
    
    顾问库
    类:

    @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;
        }
    }
    
    @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;
        }
    }
    
    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);
    
    public interface ConsultancyRepository extends CrudRepository<Consultancy, Long> {
    
        Consultancy findByConsultancyId (Long consultancyId);
    }
    
    public class ConsultancyRepositoryTest {
    
        @Autowired
        private ConsultancyRepository consultancyRepository;
    
        @Test
        public void testGetAllConsultants() {
            Consultancy consultancy = consultancyRepository.findByConsultancyId(1L);
            assertNotNull(consultancy);
            assertEquals(2, consultancy.getConsultants().size());
        }
    }
    

    我不想用加入助教