簡體   English   中英

像-休眠命名查詢

[英]LIKE - hibernate named queries

為什么使用此命名查詢會出現語法錯誤

@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%馬德里,西班牙喜歡%Spain%

其中西班牙馬德里的聖地亞哥伯納烏球場, %馬德里,西班牙%西班牙馬德里的西班牙 %柏納球場,西班牙馬德里的%

等等...

謝謝你們,答案是:

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

我不是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); 

命名查詢應如下所示:

@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

另請參閱此鏈接以獲取類似信息: 如何使用“%”正確轉換JPQL查詢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM