簡體   English   中英

Hibernate 以小寫形式返回查詢結果

[英]Hibernate is returning query result in lower case

我正在構建一個 URL 縮短服務。 從短網址檢索長網址時,休眠會自動將大小寫更改為較小的大小寫。 例如,在我的 SQL 數據庫中,我有兩行,其中一行包含“bN”數據,另一行包含“bn”

表格圖片: https : //i.stack.imgur.com/lwPjD.png

我的桌子看起來像這樣

id | longurl  | shorturl |
1  | http://..|    bn    |
2  | httP://..|    bN    |

我正在查詢“bN”,但休眠給了我“bn”的結果。

這里是 LINK 對象的定義

package com.saikat.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="urldetails")
public class Link {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="id")
    private int key;
    
    @Column(name ="shortUrl")
    private String shortUrl;
    
    @Column(name ="longUrl")
    private String longUrl;
    
    public int getKey() {
        return key;
    }
    public void setKey(int key) {
        this.key = key;
    }
    public String getShortUrl() {
        return shortUrl;
    }
    public void setShortUrl(String shortUrl) {
        this.shortUrl = shortUrl;
    }
    public String getLongUrl() {
        return longUrl;
    }
    public void setLongUrl(String longUrl) {
        this.longUrl = longUrl;
    }
    

}

下面是獲取詳細信息的代碼

    @Transactional
    public Link getLink(String Link) {
        Session currentSession = sessionFactory.getCurrentSession();
        //Link l  =currentSession.get(Link.class,8);
        Query query=currentSession.createQuery("from Link where shortUrl= :shortUrl");
        query.setParameter("shortUrl", Link);
        List<Link> link = query.getResultList();
        Link l = new Link();
        try {
            l = link.get(0);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return l;
    }

在函數 getLink 中,我傳遞的是“bN”的短鏈接。 但是當休眠返回結果時,它給出了“bn”行的結果。 我已經在調試模式下檢查過它。

調試模式的圖像:

調試模式 1

調試模式2

調試模式 3

這是查詢的日志

Hibernate: select link0_.id as id1_0_, link0_.longUrl as longurl2_0_, link0_.shortUrl as shorturl3_0_ from urldetails link0_ where link0_.shortUrl=?
13:55:11,135 TRACE BasicBinder:64 - binding parameter [1] as [VARCHAR] - [bN]
13:55:11,138 TRACE BasicExtractor:60 - extracted value ([id1_0_] : [INTEGER]) - [1]
13:55:11,146 TRACE BasicExtractor:60 - extracted value ([longurl2_0_] : [VARCHAR]) - [https://www.google.com]
13:55:11,146 TRACE BasicExtractor:60 - extracted value ([shorturl3_0_] : [VARCHAR]) - [bn]
13:55:11,147 TRACE BasicExtractor:60 - extracted value ([id1_0_] : [INTEGER]) - [2]
13:55:11,147 TRACE BasicExtractor:60 - extracted value ([longurl2_0_] : [VARCHAR]) - [https://stackoverflow.com/questions/68155013/hibernate-is-returning-query-result-in-lower-case?noredirect=1#comment120462353_68155013]
13:55:11,147 TRACE BasicExtractor:60 - extracted value ([shorturl3_0_] : [VARCHAR]) - [bN]

我正在使用 MYSQL 並將我的數據庫的排序規則更改為latin1_general_cs

在日志中,我觀察到 hibernate 正在查詢bN ,這是正確的 bt 'bn' 和 'bN'的結果都出現了

這是MySQL 的一個有趣的 特性

默認情況下,非二進制字符串比較不區分大小寫

您可以切換到二進制字符串:

對於二進制字符串(BINARY、VARBINARY、BLOB),比較使用操作數中字節的數值; 這意味着對於字母字符,比較區分大小寫。

更多選項和解釋為什么BINARY不是你想要的可以在如何在 MySQL 上進行 SQL 區分大小寫的字符串比較中找到?

暫無
暫無

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

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