У меня есть этот код, чтобы найти все совпадения в значении полей таблицы для строки str. Но только сначала выберите рабочий. Что я делаю не так?
@Override
public List<Teacher> searchByString(String str) {
return em.createQuery(
"SELECT c FROM Teacher c WHERE lower(c.fam) LIKE lower(?1)" +
" UNION " +
"SELECT c FROM Teacher c WHERE lower(c.name) LIKE lower(?1)" +
" UNION " +
"SELECT c FROM Teacher c WHERE lower(c.otch) LIKE lower(?1)" +
" UNION " +
"SELECT c FROM Teacher c WHERE lower(c.phoneNumber) LIKE lower(?1)" +
" UNION " +
"SELECT c FROM Teacher c WHERE lower(c.dateOfBirth) LIKE lower(?1)")
.setParameter(1, "%" + str + "%")
.getResultList();
}
Например, у меня есть 2 объекта.
1) Иванов Сергей Петрович 12.12.1990 9023928392
2) Александров Геннадий Иванович 10.11.19509023328392
Входная строка str = Иванов. Итак, я должен получить все эти две записи. Первый с ФАМ = Иванов, второй с ОТЧ = Иванович соответственно ниже (% str%). Но я получил только первую запись.
Входная строка = "Иванов"
Ожидаемый результат:
Иванов Сергей Петрович12.12.1990 9023928392
Александров Геннадий Иванович 10.11.1950 9023328392
Полученный результат:
Иванов Сергей Петрович 12.12.1990 9023928392
Мой класс учителя
@Entity
@Table(name="teacher", schema = "public")
@org.hibernate.search.annotations.Indexed
@SuppressWarnings("unused")
public class Teacher extends Human implements Serializable {
@Id
@Column(name="teacher_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@ManyToMany(targetEntity = Group.class,fetch=FetchType.EAGER)
@JoinTable(name = "teacher_groups",
joinColumns = { @JoinColumn(name = "teacher_id") },
inverseJoinColumns = { @JoinColumn(name = "group_id") })
@Fetch(value = FetchMode.SUBSELECT)
private List<Group> groups = new ArrayList();//<>
public List<Group> getGroups() {
return groups;
}
Мой класс человека @MappedSuperclass @ org.hibernate.search.annotations.Indexed
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
@Parameter(name = "language", value = "Russian")
})
})
public abstract class Human{
@Column
@Field(index= Index.YES, analyze= Analyze.YES, store= Store.NO)
@NotNull(message = "Поле не может быть NULL")
@Size(min = 2, max = 15, message = "Длина поля должна быть не менее 2, и не более 15 символов")
private String fam;
@Column
@Field(index= Index.YES, analyze= Analyze.YES, store= Store.NO)
@NotNull(message = "Поле не может быть NULL")
@Size(min = 2, max = 15, message = "Длина поля должна быть не менее 2, и не более 15 символов")
private String name;
@Column
@Field(index= Index.YES, analyze= Analyze.YES, store= Store.NO)
@NotNull(message = "Поле не может быть NULL")
@Size(min = 2, max = 15, message = "Длина поля должна быть не менее 2, и не более 15 символов")
private String otch;
@Column
@Field(index= Index.YES, analyze= Analyze.YES, store= Store.NO)
@NotNull(message = "Поле не может быть NULL")
@Past(message = "Время должно быть в прошлом")
@Temporal(value = TemporalType.DATE)//@Type(type = "date")
@DateTimeFormat(pattern = "dd.MM.yyyy")
//@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private Date dateOfBirth;
@Column
@Field(index= Index.YES, analyze= Analyze.YES, store= Store.NO)
@NotNull(message = "Поле не может быть NULL")
@Size(min = 15, max = 15, message = "Длина поля должна быть 15 символов")
private String phoneNumber;
//setters/getters
}