Я пытаюсь найти почтовые индексы, принадлежащие данной стране, по шаблону поиска.
Метод поиска:
public Stream<ZIP> search(final String pattern, final Long countryId) {
if (pattern == null) {
return repository.findAll().stream();
}
@Cleanup FullTextEntityManager manager = factory.get();
final QueryBuilder qb = manager.getSearchFactory().buildQueryBuilder().forEntity(ZIP.class).get();
Query query;
if (countryId == null) {
query = qb.keyword().wildcard().onField(ZIP_.zip.getName()).matching(pattern.toLowerCase() + "*").createQuery();
} else {
query = qb.bool()
.must(qb.keyword().wildcard().onField(ZIP_.zip.getName()).matching(pattern.toLowerCase() + "*").createQuery())
.must(qb.keyword().wildcard().onField(ZIP_.country.getName() + "." + Country_.id.getName()).matching(countryId).createQuery())
.createQuery();
}
return manager.createFullTextQuery(query, ZIP.class).getResultList().stream();
}
Вот мои классы сущностей:
@EqualsAndHashCode(callSuper = true)
@Entity
@Data
@Table(name = "zips")
@Indexed
public class ZIP extends TableBased {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
@Field(store = Store.YES)
@Analyzer(definition = "textAnalyzer")
private String zip;
@ManyToOne(cascade = ALL, fetch = LAZY)
@JoinColumn(name = "country", nullable = false)
@IndexedEmbedded(includeEmbeddedObjectId = true, depth = 0)
private Country country;
@OneToMany(mappedBy = "zip")
private List<Address> addresses;
}
@EqualsAndHashCode(callSuper = true)
@Entity
@Indexed
@Data
@Table(name = "countries")
public class Country extends TableBased {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
@Field(store = Store.YES)
@Analyzer(definition = "textAnalyzer")
private String name;
@OneToMany(mappedBy = "country")
private List<Province> provinces;
@OneToMany(mappedBy = "country")
private List<ZIP> zips;
@OneToMany(mappedBy = "country")
private List<Address> addresses;
@OneToOne(fetch = LAZY, mappedBy = "country")
private BaseLocation baseLocation;
}
Страна сущности также ищется сама по себе в другом варианте использования, поэтому ее @Indexed также.
Всякий раз, когда значение countryId равно нулю, все работает, как и ожидалось, но как только данный Id дает метод, он всегда возвращает пустой поток, даже если соответствующие данные существуют в базе данных. Ребята, у вас есть идеи, что случилось?