compass 中的 @SearchableComponent SearchableReference 的区别 ,及对象导航查询

来源:互联网 发布:淘宝里的淘金币在哪里 编辑:程序博客网 时间:2024/04/30 05:36

每一个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 

 



 







原创粉丝点击