这些类型没有索引,它们的任何子类型也没有索引



我使用hibernate搜索和Lucene搜索问题是我有一个用户类,这是一个超类,被正确索引(我可以进行搜索)但我也有一个医生类,它是医学类的一个子类它也是employee类的一个子类就像这样:医生->(扩展)-医务人员->(扩展)-雇员->(扩展)-用户问题是在用户类中搜索它工作正常,但结果是数据库中与名称匹配的所有用户记录我不需要这个,我需要一种方法来限制hibernate只搜索医生或护士等代码
用户类

package com.gradproject.hmis.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.gradproject.hmis.enums.BloodType;
import com.gradproject.hmis.enums.MaritalStatus;
import com.gradproject.hmis.utils.BloodTypeConverter;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import net.bytebuddy.utility.RandomString;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded;

import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@Setter
@Getter
@Entity
@Table(name = "users")
@NoArgsConstructor
@Indexed
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
protected User(String email, String phoneNumber) {
this.email = email;
this.phoneNumber = phoneNumber;
}
@Id
@SequenceGenerator(
name = "user_sequence",
sequenceName = "user_sequence"
)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_sequence")
private Long id;
@FullTextField
@Column(name = "first_name", length = 150)
private String firstName;
@FullTextField
@Column(name = "last_name", length = 150)
private String lastName;
//@NotNull
@Column(name = "national_id", length = 14, unique = true)
private Long nationalId;
@NotEmpty
@Email(regexp = "^[A-Za-z0-9._]+@[A-Za-z0-9._-]+\.[A-Za-z]{2,6}$",
message = "Enter a valid email address"
)
@FullTextField
@Column(length = 125, unique = true)
private String email;
@FullTextField
@NotEmpty
@Pattern(regexp = "^[0-9]{11}", message = "Enter a valid phone number")
@Column(name = "phone_number", unique = true)
private String phoneNumber;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
@Column
private Boolean gender;
@Column(name = "birth_date")
private LocalDate birthDate;
@Convert(converter = BloodTypeConverter.class)
@Column(length = 3)
private BloodType bloodType;
@Enumerated(EnumType.STRING)
@Column(name = "marital_status", length = 20)
private MaritalStatus maritalStatus;
@IndexedEmbedded
@Column
private FileInfo image;
@JsonIgnore
@Column(name = "jwt_token_key")
private String JwtTokenKey = RandomString.make(12);
@Column(name = "is_active")
private Boolean isActive = true;
@CreationTimestamp
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Address> addresses = new HashSet<>();
@ManyToMany(cascade = CascadeType.ALL)
private Set<Permission> permissions = new HashSet<>();
public Boolean hasPermission(String code) {
return permissions.stream().filter(p -> code.equals(p.getCode())).count() > 0;
}
@JsonProperty(value = "age", access = JsonProperty.Access.READ_ONLY)
public Integer getAge() {
if (birthDate == null) {
return null;
}
return (int) ChronoUnit.YEARS.between(birthDate, LocalDate.now());
}
@JsonProperty(value = "full_name", access = JsonProperty.Access.READ_ONLY)
public String getFullName() {
if (firstName != null || lastName != null)
return String.format("%s %s", firstName, lastName);
return email;
}

@Override
public String toString() {
return getFullName();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return id != null && Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return getClass().hashCode();
}
}

employee类


package com.gradproject.hmis.model;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Setter
@Getter
@Entity
@NoArgsConstructor
@Inheritance(strategy = InheritanceType.JOINED)
@Indexed
public class Employee extends User {
public Employee(String email, String phoneNumber, 
BigDecimal salary, Department department, Job job, Boolean isAdmin) {
super(email, phoneNumber);
this.salary = salary;
this.department = department;
this.job = job;
this.isAdmin = isAdmin;
}
//@NotNull
private BigDecimal salary;
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
@JoinColumn(name = "department_id", 
foreignKey = @ForeignKey(name="DEPARTMENT_ID_FK"))
private Department department;
//@NotNull
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "job_id", 
foreignKey = @ForeignKey(name="JOB_ID_FK"))
private Job job;
private Boolean isAdmin = false;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<Shift> shifts = new ArrayList<>();
}

医务人员等级


package com.gradproject.hmis.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.gradproject.hmis.enums.MedicalStaffType;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

@Setter
@Getter
@Entity
@NoArgsConstructor
@PrimaryKeyJoinColumn(name = "employee_id")
@JsonIgnoreProperties({"hibernate_lazy_initializer"})
@Indexed
public class MedicalStaff extends Employee {
public MedicalStaff(MedicalStaffType staffType){
this.staffType = staffType;
}
public MedicalStaff(String email, String phoneNumber, 
BigDecimal salary, Boolean isAdmin, Department department,
Job job, String role, MedicalStaffType staffType) {
super(email, phoneNumber, salary, department, job, isAdmin);
this.role = role;
this.staffType = staffType;
}
@ElementCollection(targetClass=String.class)
private Set<String> specialties = new HashSet<>();
//@NotEmpty
private String role;
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
@JoinColumn(name = "clinic_id")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Clinic clinic;
private String description;
@Column(name="max_patient_number")
private Integer maxPatientNumber = 3;
@Column(name = "appointment_price")
private BigDecimal appointmentPrice;
@Enumerated(EnumType.ORDINAL)
@Column(name="staff_type")
private MedicalStaffType staffType;
}

和医生班

package com.gradproject.hmis.model;
import com.gradproject.hmis.enums.MedicalStaffType;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import java.math.BigDecimal;
@Indexed
public class Doctor extends MedicalStaff {
public Doctor() {
super(MedicalStaffType.DoctorType);
}
public Doctor(String email, String phoneNumber, BigDecimal salary, Boolean isAdmin,
Department department, Job job, String role) {
super(email, phoneNumber, salary, isAdmin, 
department, job, role, MedicalStaffType.DoctorType);
}
}

my search method

@Override
public List<User> searchforUsers(String term, int start, int size) {
SearchResult<User> userresult = Search.session(entityManager)
.search(User.class)
.where(f -> f.match()
.fields("firstName", "lastName", "email")
.matching(term).fuzzy()).fetch(start, size);
return userresult.hits();
}

这个方法可以正常工作,但是当我为医生班做同样的事情

@Override
public List<Doctor> searchForDoctors(String term, int start, int size) {
SearchResult<Doctor> supplierresults = Search.session(entityManager)
.search(Doctor.class)
.where(f -> f.match()
.fields("firstName", "lastName", "email")
.matching(term).fuzzy()).fetch(start, size);
return supplierresults.hits();
}

我得到这个错误


Invalid target types: [com.gradproject.hmis.model.Doctor] These types are not indexed, nor is any of their subtypes

整个误差


org.hibernate.search.util.common.SearchException: HSEARCH000234: Invalid target types: [com.gradproject.hmis.model.Doctor] These types are not indexed, nor is any of their subtypes.
at org.hibernate.search.mapper.pojo.scope.impl.PojoScopeDelegateImpl.create(PojoScopeDelegateImpl.java:76) ~[hibernate-search-mapper-pojo-base-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.search.mapper.pojo.mapping.impl.PojoMappingDelegateImpl.createPojoScope(PojoMappingDelegateImpl.java:87) ~[hibernate-search-mapper-pojo-base-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.search.mapper.orm.mapping.impl.HibernateOrmMapping.doCreateScope(HibernateOrmMapping.java:435) ~[hibernate-search-mapper-orm-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.search.mapper.orm.mapping.impl.HibernateOrmMapping.createScope(HibernateOrmMapping.java:376) ~[hibernate-search-mapper-orm-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.search.mapper.orm.session.impl.HibernateOrmSearchSession.scope(HibernateOrmSearchSession.java:164) ~[hibernate-search-mapper-orm-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.search.mapper.orm.session.impl.HibernateOrmSearchSession.massIndexer(HibernateOrmSearchSession.java:158) ~[hibernate-search-mapper-orm-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.search.mapper.orm.session.impl.DelegatingSearchSession.massIndexer(DelegatingSearchSession.java:69) ~[hibernate-search-mapper-orm-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.search.mapper.orm.session.SearchSession.massIndexer(SearchSession.java:142) ~[hibernate-search-mapper-orm-6.1.5.Final.jar:6.1.5.Final]
at com.gradproject.hmis.OnApplicationStartEvent.onApplicationEvent(OnApplicationStartEvent.java:54) ~[classes/:na]
at com.gradproject.hmis.OnApplicationStartEvent.onApplicationEvent(OnApplicationStartEvent.java:19) ~[classes/:na]
at com.gradproject.hmis.OnApplicationStartEvent$$FastClassBySpringCGLIB$$df5c6fda.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.16.jar:5.3.16]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.16.jar:5.3.16]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.16.jar:5.3.16]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.16.jar:5.3.16]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.16.jar:5.3.16]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.16.jar:5.3.16]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.16.jar:5.3.16]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.16.jar:5.3.16]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.16.jar:5.3.16]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.16.jar:5.3.16]
at com.gradproject.hmis.OnApplicationStartEvent$$EnhancerBySpringCGLIB$$8b5686d8.onApplicationEvent(<generated>) ~[classes/:na]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.16.jar:5.3.16]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.16.jar:5.3.16]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.16.jar:5.3.16]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) ~[spring-context-5.3.16.jar:5.3.16]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-5.3.16.jar:5.3.16]
at org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:114) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:82) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplicationRunListeners$$Lambda$1502/0x000000009fb302a8.accept(Unknown Source) ~[na:na]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:82) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.4.jar:2.6.4]
at com.gradproject.hmis.HmisApplication.main(HmisApplication.java:28) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.4.jar:2.6.4]

我不知道你的Doctor类是什么,但它显然不是Hibernate ORM实体。该类上没有@Entity注释

Hibernate Search的Hibernate ORM映射器(你正在使用的那个)只索引Hibernate ORM实体。因此,目前Doctor上的@Indexed注释被忽略。

我建议用@Entity注释Doctor


(我在JIRA上提交了一个ticket, HSEARCH-4344,以自动提前警告这个配置问题。这将是棘手的实现,但希望有一天,我们将免除某人的困惑,你现在正在经历)。

最新更新