首页 / JAVA / Java-在数据库中搜索关键字
Java-在数据库中搜索关键字
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java-在数据库中搜索关键字,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2537字,纯文字阅读大概需要4分钟。
内容图文
![Java-在数据库中搜索关键字](/upload/InfoBanner/zyjiaocheng/882/01dff8ebe9f84c1f86691c0790726af3.jpg)
我正在使用Eclipselink,并且关于JPA NamedQueries有一个棘手的问题.
我的数据库表包含一列来自VARCHAR类型的列,并将以逗号分隔的关键字列表存储为一个字符串.
如何在JPA中创建NamedQuery来搜索这些关键字?
我想提供一个字符串列表作为参数,因此,我想要一个对象列表,其中关键字列表包含参数列表中的一个字符串.
可能如下所示:
List<String> keywordList = new ArrayList<String>();
keywordList.add("test");
keywordList.add("car");
List<Object> result = em.createNamedQuery("findObjectByKeywords", Object.class)
.setParameter("keywords", keywordList)
.getResultList();
不幸的是,我不是那么大的数据库/ SQL专家.也许有人可以帮助我?
希望你能理解我的问题.
编辑:
我正在使用Weblogic 10.3.6进行开发,这意味着我无法使用JPA 2.0功能.
编辑2:
在Oracle Enterprise Pack for Eclipse的帮助下,我设法在Weblogic Server中激活了JPA 2.0.我认为问题解决了.
解决方法:
对JPA2.0有效
正如Bhesh所说,简单的JPQL不会成功.生成的SQL必须包含类似于以下内容的where子句:
where keywords like '%keyword1%' or keywords like '%keyword2%' or ... or keywords like '%keywordN%'
这意味着:我们需要在这里循环!
您可以尝试自己构建JPQL,就像Bhesh在他的第一句话中建议的那样,尽管他也表示这不是一个好主意.但是不用担心-JPA还提供了Criteria API,在这种情况下非常方便.因此,尽管您将没有命名查询,但仍可以通过JPA通过以下方式进行查询:
public List<YourEntity> findAllByKeywords(List<String> keywords){
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<YourEntity> query = builder.createQuery(YourEntity.class);
Root<YourEntity> root = query.from(YourEntity.class);
List<Predicate> predicates = new LinkedList<>();
for (String keyword : keywords) {
predicates.add(builder.like(root.<String>get("keywords"), "%" + keyword + "%"));
}
return entityManager.createQuery(
query.select(root).where(
builder.or(
predicates.toArray(new Predicate[predicates.size()])
)
))
.getResultList();
}
或(使用番石榴总是略胜一筹)
public List<YourEntity> findAllByKeywords(List<String> keywords){
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<YourEntity> query = builder.createQuery(YourEntity.class);
final Root<YourEntity> root = query.from(YourEntity.class);
return entityManager.createQuery(
query.select(root).where(
builder.or(
transform(keywords, toPredicateFunction(builder, root)).toArray(new Predicate[]{})
)
))
.getResultList();
}
private Function<String, Predicate> toPredicateFunction(final CriteriaBuilder builder, final Root<YourEntity> root) {
return new Function<String, Predicate>() {
@Override
public Predicate apply(String input) {
return builder.like(root.<String>get("keywords"), "%" + input + "%");
}
};
}
内容总结
以上是互联网集市为您收集整理的Java-在数据库中搜索关键字全部内容,希望文章能够帮你解决Java-在数据库中搜索关键字所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。