Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用Hibernate搜索对子实体进行搜索_Java_Hibernate_Jpa_Lucene_Hibernate Search - Fatal编程技术网

Java 无法使用Hibernate搜索对子实体进行搜索

Java 无法使用Hibernate搜索对子实体进行搜索,java,hibernate,jpa,lucene,hibernate-search,Java,Hibernate,Jpa,Lucene,Hibernate Search,我在name字段的Master实体上使用Hibernate。它运转平稳。但是,我也想搜索它的孩子 实体子主体的子名称字段 我已经添加了Hibernate搜索文档中指定的@IndexedEmbedded和@ContainedIn注释。但是,它又是空的 当我尝试搜索子名称时 @Entity @Indexed @Table(name = "master", catalog="mydb") public class Master implements java.io.Serializable {

我在
name
字段的
Master
实体上使用Hibernate。它运转平稳。但是,我也想搜索它的孩子 实体
子主体的
子名称
字段

我已经添加了Hibernate搜索文档中指定的
@IndexedEmbedded
@ContainedIn
注释。但是,它又是空的 当我尝试搜索
子名称时

@Entity
@Indexed
@Table(name = "master", catalog="mydb")
public class Master implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "seq", unique = true, nullable = false)
    private Integer seq;

    @Column(name = "name", length = 45)
    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "master")
    @IndexedEmbedded
    private Set<SubMaster> subMasters = new HashSet<SubMaster>(0);

    //Getters and Setters
}


@Entity
@Table(name = "sub_master", catalog="mydb")
public class SubMaster implements java.io.Serializable {

    @Id
    @Column(name = "seq", unique = true, nullable = false)
    private Integer seq;

    @Column(name = "sub_name", length = 45)
    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    private String subName;

    @ManyToOne(fetch = FetchType.EAGER)
    @ContainedIn
    private Master master = new HashSet<Master>(0);

    //Getters and Setters
}
@实体
@索引
@表(name=“master”,catalog=“mydb”)
公共类主控实现java.io.Serializable{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“seq”,unique=true,nullable=false)
私有整数序列;
@列(name=“name”,长度=45)
@字段(index=index.YES,analyze=analyze.YES,store=store.NO)
私有字符串名称;
@OneToMany(fetch=FetchType.EAGER,mappedBy=“master”)
@指数化
私有集子集=新哈希集(0);
//接球手和接球手
}
@实体
@表(name=“sub_master”,catalog=“mydb”)
公共类SubMaster实现java.io.Serializable{
@身份证
@列(name=“seq”,unique=true,nullable=false)
私有整数序列;
@列(name=“sub_name”,长度=45)
@字段(index=index.YES,analyze=analyze.YES,store=store.NO)
私有字符串子名称;
@manytone(fetch=FetchType.EAGER)
@包含
私有主节点=新哈希集(0);
//接球手和接球手
}
搜索代码:

FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);

QueryBuilder qb = fullTextEntityManager.getSearchFactory()
        .buildQueryBuilder().forEntity(Master.class).get();

org.apache.lucene.search.Query query = qb
      .keyword()
        .wildcard()
      .onFields("name", "subMasters.subName")
      .matching("*"+token.toLowerCase()+"*")
      .createQuery();

javax.persistence.Query jpaQuery =
        fullTextEntityManager.createFullTextQuery(query, Master.class);

@SuppressWarnings("unchecked")
List<Master> result = jpaQuery.getResultList();
FullTextEntityManager FullTextEntityManager=org.hibernate.search.jpa.search.getFullTextEntityManager(em);
QueryBuilder qb=fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(Master.class).get();
org.apache.lucene.search.Query Query=qb
.keyword()
.通配符()
.onFields(“名称”、“子主.子名称”)
.matching(“*”+标记.toLowerCase()+“*”)
.createQuery();
javax.persistence.Query jpaQuery=
fullTextEntityManager.createFullTextQuery(query,Master.class);
@抑制警告(“未选中”)
List result=jpaQuery.getResultList();
正在建立的索引:

名字 _冬眠类


任何方向正确的帮助都将不胜感激。提前感谢。

不确定是否是打字错误,但:

.onFields("name", "subMaster.subName")
应该是:

.onFields("name", "subMasters.subName")
在“subMasters”的末尾有一个s


当你遇到这种情况时,看看你与Luke()的索引,它会有很大帮助。

感谢所有试图帮助我的人。但是,我自己已经解决了这个问题。我使用
hibernate工具
从数据库生成实体,生成的实体在
@Table
注释中有一个属性
目录


我删除了这个
catalog
属性,重新索引了我的实体,并对
子主机执行了搜索。子主机名
,它工作得很好。

您使用的是什么版本的Hibernate搜索?如何创建和持久化实体(代码会有所帮助)?@YoannRodière我使用的是5.7.1.Final版本,我使用的是EntityManager来持久化实体。我已经检查过了,只要我坚持一个实体,就会创建Master的索引。对不起,这是一个输入错误。更正。我已经与luke进行了核对,我能够在我的索引中看到
名称
\u hibernate\u类
作为可用术语,我相信
\u hibernate\u类
是我的子实体。但是,它不应该是subMasters.subName,而应该是在“主”索引中有一个字段“subMasters.subName”。这就是Hibernate搜索的工作原理。确保已使用最新的代码更改对数据重新编制索引。我不知道从哪里粘贴代码,但@ManyToOne(fetch=FetchType.EAGER,mappedBy=“subMaster”)中还有另一个输入错误,应该是subMaster。也许可以尝试用我们的模板构建一个简单的自包含测试用例。也许更容易看出具体代码的错误。是的,这是一个打字错误。事实上,我刚刚重命名了变量,把代码放在这里,这就是打字错误的原因,我道歉。但是,我有一个Master类的工作代码,但Sub-Master不工作。@GuilaumeSmet我添加了一个具体的项目来演示我的问题。看一看