我有2个实体:广告和类别;
我在Ad实体上有一个FullTextSearch(lucene),我想在广告和类别之间建立一个“联接”甜菜,或者以某种方式在Ad.category.id上添加where子句。
我的添加课程:
@Entity
@Indexed
@Table(name = "adds")
public class Ad implements Serializable {
@Id
@SequenceGenerator(name="AdSQ", sequenceName="AdSQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AdSQ")
@Column(name = "id")
@JsonProperty("Id")
private Long __Id;
@OneToOne(fetch = FetchType.LAZY)
@IndexedEmbedded
@JoinColumn(name="idCategory", foreignKey = @ForeignKey(name = "FK_AD_CATEGORY"))
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Category category;
@Column(name = "price")
@JsonProperty("Price")
@Field
private Double _Price;
....
}
和类别:
@Entity
@Table(name = "categories"/*, indexes = {@Index(columnList="id",name = "index_category")}*/)
public class Category implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="CategorySQ")
@SequenceGenerator(name="CategorySQ", sequenceName="CategorySQ", allocationSize = 1)
@JsonProperty("Id")
@Column(name="id")
private Long __Id;
我在广告上使用了IndexedEmbedded,我认为应该将@field放在类别的if字段上。
我应该如何建立链接?我需要使用特殊类型的查询,分析器吗?
最佳答案
首先,请注意,您选择使用非标准属性名称(至少就JavaBeans约定而言)可能会导致Hibernate ORM和Hibernate Search出现问题,这可能无法正确检测到属性。我不确定会不会,但是我只是警告您:如果不起作用,请尝试重命名属性。
回到您的问题,您已经通过添加@IndexedEmbedded
建立了链接。如果您在搜索查询中仅需要类别ID,则可以简单地使用@IndexedEmbedded(includeEmbeddedObjectId = true, depth = 0)
而不添加任何字段。depth = 0
是可选的,将仅确保除类别ID外没有嵌入任何内容。
然后,您只需在Ad
上的查询中添加一个子句:
Query categoryQuery = queryBuilder.keyword().onField( "category.__Id" ).matching( <some ID> ).createQuery()
Query booleanJunction = queryBuilder.bool()
.must( categoryQuery )
.must( <some other query> )
.must( <some other query> )
.createQuery()
FullTextQuery fullTextQuery = fullTextEntityManager.createQuery( booleanJunction, Ad.class );
如果希望字段名称不同,则必须在
@DocumentId(name = "yourIdName")
类的__Id
字段上添加Category
批注。然后像这样查询:Query categoryQuery = queryBuilder.keyword().onField( "category.yourIdName" ).matching( <some ID> ).createQuery()
Query booleanJunction = queryBuilder.bool()
.must( categoryQuery )
.must( <some other query> )
.must( <some other query> )
.createQuery()
FullTextQuery fullTextQuery = fullTextEntityManager.createQuery( booleanJunction, Ad.class );