如何在JPA / Hibernate @NamedNativeQuery和Spring Data中使用“like”谓词和“%”

时间:2013-07-12 09:19:29

标签: mysql hibernate spring-data-jpa named-query

我目前正在尝试为我的一个实体类实现@NamedNativeQuery。我的项目使用Spring数据,我的数据库中有两个表:Pizza和Town(披萨的起源)。查询本身包括通过提供城镇名称来查找比萨饼。因此,查找town.name是否包含提供的参数(在我们的例子中是城镇名称的一部分)。很自然地,我有这样的事情:

@NamedNativeQueries({
@NamedNativeQuery(
    name = "Pizza.findByTown",
    query = "select p.* from pizza p join town t on p.town_id = t.id on where t.name like '%?1%'",
    resultClass = Pizza.class
)
})
public class Pizza {
}

所以在我的PizzaRepository中,我添加了以下内容

public interface PizzaRepository extends JpaRepository<Pizza, Long>, QueryDslPredicateExecutor<Pizza> {
    Pizza findByTown(final String townName)

似乎%不适用于命名查询。有没有解决这个问题?任何帮助将不胜感激。

感谢

[编辑]:我添加了带注释的类Town

@Entity
@Table(name = "Town")
public class Town {
    @Id
    @Column(name = "town_id")
    private String townId;

    @Column(name = "name", nullable = false)
    private String name;

    @Lob
    @Column(name = "picture", nullable = false)
    private byte[] picture;
}

2 个答案:

答案 0 :(得分:1)

您可以尝试以下查询

select p.* from pizza p join town t on p.town_id = t.id on where t.name like :param_1"

然后在代码中,可以设置如下参数。

query.setParameter("param_1", "%"+param_value+"%");

答案 1 :(得分:0)

您是否真的需要此请求的本机查询。使用JPQL / HQL,使用findByTownContaining会更容易:这会直接添加你的%。 见表2.2。 spring data jpa documentation http://static.springsource.org/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html

上的方法名称中支持的关键字