【问题标题】:LIKE - hibernate named queriesLIKE - 休眠命名查询
【发布时间】:2014-12-07 10:14:45
【问题描述】:

为什么我使用这个命名查询得到语法错误

@NamedQuery(name = "event_find", query = "from Event where location.address like str('%'+:address+'%') " +
        "or :address like str('%'+location.address+'%'")

和:

Query query = session.getNamedQuery("event_find").setParameter("address", address); // or "%"+address+"%"

我该如何解决这个问题?

编辑:

事件:

@NamedQueries({
        @NamedQuery(name = "event_find", query = "from Event where location.address like :address " +
        "or :address like location.address")
})
@Entity
@Table(catalog = "control_station")
public final class Event implements Serializable {

    private long id;
    private Location location;
    ...

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    public Location getLocation() {
        return location;
    }

    public void setLocation(Location location) {
        this.location = location;
    }

    ...

}

位置:

@Entity
@Table(catalog = "control_station")
public final class Location implements Serializable {

    private long id;
    private String address;
    private double latitude;
    private double longitude;

    ...
}

例如,假设我们在表Location 中有三个地址:

  1. 西班牙
  2. 西班牙马德里
  3. 圣地亚哥伯纳乌球场,马德里,西班牙

现在如果我搜索西班牙马德里,结果必须包含以上所有内容...

即:

西班牙%Madrid, Spain%Madrid, Spain%Spain%

圣地亚哥伯纳乌球场,西班牙马德里,例如 %Madrid, Spain%马德里,西班牙,例如 %Santiago Bernabeu Stadium , 马德里, 西班牙%

等等……

【问题讨论】:

    标签: java mysql hibernate hql named-query


    【解决方案1】:

    谢谢大家,答案是:

    @NamedQuery(name = "event_find", query = "from Event where location.address like concat('%', :address, '%') or :address like concat('%', location.address, '%')")
    

    【讨论】:

      【解决方案2】:

      命名查询应该是这样的:

      @NamedQuery(name = "event_findLike", query = "from Event where location.address like str(:address) " +
              "or :address like :locationAddress
      

      您不应在此命名查询中使用 %

      您可以在设置参数时使用% 符号,如下所示:

      Query query = session.getNamedQuery("event_findLike")
      .setParameter("address", '%'+address+'%')
      .setParameter("locationAddress", '%'+locationAddress+'%');
      

      在此代码中,将 addresslocationAddress 替换为包含所需信息的变量。

      有关类似信息,另请参阅此链接:How to correctly convert JPQL query using "%"

      【讨论】:

        【解决方案3】:

        我不是 Hibernate 专家,但据我所知,您可能有两个问题:

        • 首先我认为您需要将% 放在setParameter() 调用中,而不是直接放在命名查询中。这也意味着您最终会得到两个参数。
        • 其次,我假设str() 不需要,因为location.address 可能已经是一个字符串。此外,您的 str() 调用末尾似乎缺少括号。

        所以,我会尝试类似的方法:

        @NamedQuery(name = "event_findLike", query = "from Event where location.address like :addressLike " +
            "or :address like '%'+location.address+'%'")
        

        Query query = session.getNamedQuery("event_findLike").setParameter("addressLike", "%"+address+"%").setParameter("address", address); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-20
          相关资源
          最近更新 更多