每一个pojo 类中的字段都 有一个alias ,默认就是字段名
package org.jixiuf.pojo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.compass.annotations.Index;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableComponent;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.compass.annotations.Store;
@Entity
@Searchable(poly=true)
public class User {
String id;
String name;
String address;
Role r ;
@Id
@Column(name = "id")
//@GenericGenerator(strategy = "uuid.hex", name = "uuidGen")
// @GeneratedValue(generator = "uuidGen")
@SearchableId
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@SearchableProperty(index = Index.ANALYZED, store = Store.YES)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@SearchableProperty(index = Index.ANALYZED, store = Store.YES)
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
互换这两个值
@SearchableComponent
//@SearchableReference
@ManyToOne
@JoinColumn(name="roleId" )
public Role getR() {
return r;
}
public void setR(Role r) {
this.r = r;
}
}
=====================================================
//初始化数据
@Test
public void testSave() {
CompassSession s = CompassUtil.getCompassSession();
CompassTransaction tac = session.beginTransaction();
try {
Role r = new Role();
r.setId("00000003");
r.setName("admin");
User u = new User();
u.setR(r);
u.setId("000001");
u.setName("jixiuf");
u.setAddress("山东临沂");
u.setR(r);
s.save(r);
s.save(u);
tac.commit();
session.commit();
} catch (CompassException ce) {
System.out.println("error==============");
ce.printStackTrace();
session.rollback();
}
}
=====================================
package org.jixiuf.pojo;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.compass.annotations.Index;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.compass.annotations.Store;
@Entity
@Table(name = "role_")
@Searchable(poly=true)
public class Role {
String id;
String name;
@SearchableId
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@SearchableProperty(index=Index.UN_TOKENIZED,store=Store.YES)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//这个方法用来查看一个对象(此处为User)有哪些属性可以进行查询
举个例子
$/User/class
$/User/id
$/User/r/class
$/User/r/id
$/uid
address
name
@Test
public void testAlias() {
Compass compass = HibernateHelper.getCompass(sf);
CompassSession session = compass.openSession();
// CompassHits hits = session.find("jixiuf");
CompassHits hits = session.queryBuilder().alias(
User.class.getSimpleName()).hits();
System.out.println(hits.length());
for (int i = 0; i < hits.length(); i++) {
Resource r = hits.resource(i);
Property[] ps = r.getProperties();
for (Property p : ps) {
System.out.println(p.getName());
}
}
}
当使用//@SearchableReference 从User 只能得到user.role.id
而不能获得user.role 中的其他属性,如name
即User 对象中只保存role 的一个id
类比于hibernate 中的hql 我们可以做以下查询
from User u where u.r.id=00000003 ;
却不能做
from User u where u.r.name='admin';
因为name 是普通属性
再说一说查询
hql 中from User u where u.r.id=00000003 ; 相同效果的compass 搜索如下
CompassSession session = compass.openSession();
// CompassHits hits = session.find("jixiuf");
CompassHits hits = session.queryBuilder()
.term("$/User/r/id ", " 00000003 ").hits();
System.out.println(hits.length());
for (int i = 0; i < hits.length(); i++) {
User u = (User) hits.data(i);
System.out.println(u.getId());
}
可以理解为$/User/r/id 就相当 于hql 中的user.role.id 即对象导航
=================================
如果将@ SearchableReference 改成 @SearchableComponent
则可以对除了id 之外的普通属性作为条件进行查询
如 $User/r/name