我已经使用Java很长一段时间了,但有些事情对我来说仍然不太清楚,特别是涉及到泛型......
事情就是这样:我Search正在使用这个类(详见此处),构造如下:
public Search(Class<?> searchClass) {...}
Run Code Online (Sandbox Code Playgroud)
此外,我有一个参数化的通用包装器,如下所示:
public class HibernateSearch<E> extends Search implements Serializable {
public HibernateSearch(Class<E> entityClass) {
super(entityClass);
}
// ... omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要的是以下内容:我想创建参数化类,其中包含此类作为其字段,例如
public class BaseSelectorComposer<T> extends SelectorComposer<Window> {
private HibernateSearch<T> searchObject;
...
@Override
public void doAfterCompose(Window comp) throws Exception {
super.doAfterCompose(comp);
this.searchObject =
new HibernateSearchObject<T>( now what...??? );
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
我认为,从给定的例子中我所面临的问题是显而易见的.
有人可以建议在这里可以做些什么,或者一些替代方案?
假设我有2个实体注释用于全文搜索:
@Entity
public class User implements Serializable {
@Id
public Long id;
...
}
@Entity
@Indexed
public class Post {
@Id
public Long id;
@Field(name = "content")
public String content;
@ManyToOne
public User user;
...
}
Run Code Online (Sandbox Code Playgroud)
在内容字段上编写全文搜索非常简单.但是如何通过text关键字和用户ID过滤结果?例如,在内容字段上搜索"hello"而在user.id上搜索等于10的查询?
我有以下带注释的类,我试图从lucene/hibernate搜索查询中对结果进行排序.我终于让查询正常工作但似乎当我实现必要的注释(在jobStatus上看到)对该列进行排序时,它使得无法再搜索该列.我基于谷歌在这里找到的说明.我一直在解决整个hibernate搜索和排序问题,现在我终于想出如何排序和搜索我需要的是能够一起完成它们.
@Entity
@Table(name="jobReq")
@Indexed
public class JobReq {
@Id
@DocumentId
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Field(index = Index.YES)
@Column(name="jobId", nullable=false, unique=true)
private String jobId;
@Field(index = Index.YES)
@Column(name="jobTitle", nullable=false)
private String jobTitle;
@Field(index = Index.YES)
@Column(name="jobContract", nullable=false)
private String contract;
@Field(index = Index.YES)
@Column(name="jobProject", nullable=true)
private String project;
@Field(index = Index.YES)
@Column(name="jobLaborCategory", nullable=false)
private String laborCategory;
@Field(index = Index.YES)
@Column(name="jobSummary", nullable=false)
private String summary;
@Field(index = Index.YES)
@Column(name="jobDescription", nullable=false)
private String jobDescription;
@Fields({@Field, @Field(analyze = Analyze.NO, name …Run Code Online (Sandbox Code Playgroud) 线程"main"中的异常java.lang.VerifyError:class org.hibernate.search.util.impl.DelegateNamedAnalyzer重写final方法tokenStream.(Ljava/lang/String; Ljava/io/Reader;)Lorg/apache/lucene/analysis /的TokenStream;
如何在Lucene Search中使用带有StandardAnalyzer的booleanQuery?
Hibernate Search(lucene)是否有可能组合两个不同的查询.例如,当我想要搜索具有一个对应匹配值的2个字段时:
firstname - John
lastname - Doe
qBuilder.keyword().onField("firstname").matching("John").createQuery());
qBuilder.keyword().onField("lastname").matching("Doe").createQuery());
Run Code Online (Sandbox Code Playgroud)
是一种从这一个查询?
我正在使用基于Lucene索引构建的Hibernate Search.如果针对数据库表创建索引,则返回结果的性能将很好.
我的问题是,一旦创建了索引,如果我们查询结果,Hibernate Search是否使用创建的索引从原始数据库表中获取结果?或者它不需要命中数据库来获取结果?
谢谢!
我有 JUnit4 测试类,用此方法以及其他方法进行注释:@Transactional
@Test
public void testDiscoverArtworksByTitle()
{
FullTextEntityManager ftem = Search.getFullTextEntityManager(this.entityManager);
this.prepareArtworksForListing();
ftem.flushToIndexes();
List<ArtworkListItem> listItems = this.artworkService.discoverArtworksByTitle("Die Hard");
Assert.assertNotEquals("There are some items in the list", 0, listItems.size());
// housekeeping
ftem.purgeAll(ArtworkEntity.class);
}
Run Code Online (Sandbox Code Playgroud)
基本上,我正在构建一些发现功能,我想在开发时(主要是稍后)对其进行正确测试。关键是,这个测试总是失败,就好像索引根本没有建立一样。该方法在内存数据库中prepareArtworksForListing()创建(使用persist(..))一些记录。HSqlDbHibernate 与 H.Search/Lucene 正确连接,因为当我用 注释此方法并@Transactional(propagation = Propagation.NOT_SUPPORTED)显式调用em.getTransaction().begin()和时em.getTransaction().commit()/.rollback(),测试通过,但随后的测试方法失败并显示READ_ONLY TX Error,就好像@Transactional该类缺少原始属性一样。
我使用spring junit测试,但是我在所有测试中都收到了这条错误消息,因为我更新了我的Hibernate Search,Hibernate和Springframework.在pom.xml中我包含了来自Hibernate的common.annotations,我也可以在我的库(maven依赖)中找到它,它应该包含在类路径中.但似乎我的测试仍然无法找到课程.
这是pom.xml配置:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.5.Final</version>
</dependency>
<dependency>
<artifactId>hibernate-core</artifactId>
<groupId>org.hibernate</groupId>
<version>4.3.5.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>5.0.0.Alpha3</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>4.7.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ClassLoadingException
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1402)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:397)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
... 40 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.ClassLoadingException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 51 more
Run Code Online (Sandbox Code Playgroud)