Hibernate createQuery union для всех полей - PullRequest
0 голосов
/ 12 октября 2019

У меня есть этот код, чтобы найти все совпадения в значении полей таблицы для строки 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

}
...