【问题标题】:How to use "like" predicate and "%" in JPA/Hibernate @NamedNativeQuery and Spring Data如何在 JPA/Hibernate @NamedNativeQuery 和 Spring Data 中使用“like”谓词和“%”
【发布时间】:2013-07-10 19:07:32
【问题描述】:

我目前正在尝试为我的一个实体类实现 @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;
}

【问题讨论】:

  • 我不确定 findByTown 是否会使用定义的本机查询 (Pizza.findByTown)。是什么错误,或者生成的SQL?
  • 你真的需要一个本机查询来处理这个请求吗?使用 JPQL/HQL 会更容易使用 findByTownContaining :这将直接添加您的 %
  • @willome 我必须这样做,因为 Town 表在开始时不是 JPA 模型的一部分(已添加此表)所以我尝试通过添加注释来 JPA 映射它(自下而上的方法)。我的尝试失败了,因为该表包含一个 BLOB 列,并且使用“@Lob”映射此列导致错误:“找到 longblob,预期:blob”,即使我正在添加带有“@Column”注释的 columnDefinition。如果我能找到正确映射 blob 列 db 的方法,那么我可以解决它。有什么提示吗?
  • 您能否发布具有此@Lob 列的实体(可能是映射错误)
  • @willome 我已经编辑了 Town 类以供您参考。 DB 中的表定义是一个 BLOB。

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


【解决方案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+"%");

【讨论】:

  • 但我不能这样设置,因为我直接使用 Spring 数据作为设置查询参数的一种方式(c.f:PizzaRepository 接口中的 findByTown 方法)
【解决方案2】:

对于这个请求,你真的需要一个本机查询吗?使用 JPQL/HQL 会更容易使用 findByTownContaining :这将直接添加您的 %。 见表 2.2。 spring data jpa 文档http://static.springsource.org/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html上的方法名称中支持的关键字

【讨论】:

  • 再一次,问题是“@Lob”给我这种方法的错误。即使我使用 columndefinition,它也会不断向我发送“预期的 longblob,找到:blob”。所以我想必须修复类型的不匹配。
  • ALTER TABLE my_table_name CHANGE my_column my_column LONGBLOB 默认为 NULL; ?
猜你喜欢
  • 1970-01-01
  • 2022-11-21
  • 2017-12-25
  • 2019-07-20
  • 2014-08-10
  • 2020-08-24
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多