用于搜索单词/字符串是否包含在实体字段之一中的JPQL查询

时间:2014-01-15 12:41:22

标签: java java-ee jpa jpql

基本上,它类似于查看句子中是否存在某个单词。 有实体邮政:

public class Post implements Serializable {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "post_id", unique = true, nullable = false)
    private Integer id; 

    @Column(name = "post_title", length=300, unique = false, nullable = false)
    private String title;

    @Column(name = "post_date", unique = false, nullable = false)
    private Date date;
        ...}

我正在尝试实现JPQL查询,该查询将在Post中搜索具有特定字/字符串(byTitle,作为参数传递)的title实体实例字段以及Date类型的另外两个参数,表示日期范围 - startDateendDate

我脑子里有这样的事情: SELECT p FROM Post p WHERE :byTitle IN (set of strings created from parsing p.title field) AND p.date>=:startDate AND p.date<=endDate

如何实现这种JPQL查询?或者也许应该使用JPA Criteria API?

修改 就像Java中有someString.contains(someSubstring)函数一样,JPQL中有类似的东西吗?或Criteria API?为了进行比较,它不必区分大小写。

2 个答案:

答案 0 :(得分:5)

我使用JPQL LIKE与模式表达式配对实现了它:

SELECT p FROM Post p WHERE 
       p.title LIKE :pattern AND 
               p.date>=:startDate AND 
                     p.date<=:endDate

其中pattern = "%" + someString + "%"

答案 1 :(得分:1)

我认为你必须使用OR连接的几个LIKE子句:

WHERE (p.title LIKE :firstWord OR ... OR p.title LIKE :lastWord) AND p.date >= :startDate AND p.date <= :endDate

然后设置参数:

query.setParameter("firstWord", '%' + firstWord + '%');
...
query.setParameter("lastWord", '%' + lastWord + '%');

但查询可能很慢。您可以考虑使用专用的全文搜索工具,例如Hibernate Search