在实体映射,多层次关联:
//双向一对多
Salesman.java:
@OneToMany(mappedBy="salesman",cascade = CascadeType.ALL)//双向一对多
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@ContainedIn
private Set<CarOrder> carOrders = new HashSet();
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@IndexedEmbedded(depth=1)//嵌入和关联实体映射
private Address address;
address.java:
@Field(name="city",index=Index.TOKENIZED)//嵌入和关联实体映射
@Column
private String city;
CarOrder.java:
@ManyToOne
@JoinColumn(name = "salesId")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@IndexedEmbedded(depth=2)//嵌入和关联实体映射
private Salesman salesman;
Test.java:
void queryEntity() throws Exception{//处理实体映射的QueryBuilder方法
session = sf.openSession();
FullTextSession fullTextSession=Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity( CarOrder.class ).get();
//查询是把salesman.address.city替换就可获取其他结果,如carName就可以直接获取本身的值,并不用通过关联来获取值
org.apache.lucene.search.Query query = qb.keyword().onFields("salesman.address.city").matching("军恶").createQuery();
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(query, CarOrder.class);
List result = hibQuery.list();
for(int i=0;i<result.size();i++)
{
CarOrder bc3 = (CarOrder) result.get(i);
System.out.println("id for the selected basiccar is:"
+bc3.getSalesman().getAddress().getCity());
}
tx.commit();
session.close();
}