簡體   English   中英

如何轉義 Hibernate 的 HQL 中的保留字

[英]How to escape reserved words in Hibernate's HQL

我使用以下查詢獲取java.util.Map索引idtextobject

Query q = mySession.createQuery(
    "SELECT u.id AS id, u.name AS text, u AS object FROM User u")
    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

...但是object似乎是一個保留字。 例如obj就可以了。 當前在 HQL 中轉義別名的方式是 MySQL 使用反引號轉義的方式是什么?

使用反引號會出現以下錯誤:

Exception in thread "main" org.hibernate.QueryException: unexpected char: 
'`' [SELECT u.id AS id, u.name AS text, u AS `object` FROM User u]

您可以通過使用自定義“別名映射”轉換器的解決方法來實現它,因此您的代碼將更改為此類型

Query q = mySession.createQuery(
    "SELECT u.id AS id, u.name AS text, u AS obj FROM User u")
    .setResultTransformer(
        AliasToMapTransformer.renameAlias("obj", "object").build()
    );

然后使用這個類:

public class AliasToMapTransformer extends BasicTransformerAdapter {

    private Map<String, String> renameAliasMap;


    public AliasToMapTransformer(Map<String, String> renameAliasMap) {
        this.renameAliasMap = (renameAliasMap == null) ? Collections.<String, String>emptyMap() : renameAliasMap;
    }


    @Override
    public Object transformTuple(Object[] tuple, String[] aliases) {
        Map<String, Object> result = new HashMap<String, Object>(tuple.length);
        for (int i = 0; i < tuple.length; i++) {
            String alias = aliases[i];
            if (alias != null) {
                String newAlias = renameAliasMap.get(alias);

                result.put((newAlias != null) ? newAlias : alias, tuple[i]);
            }
        }
        return result;
    }


    public static Builder renameAlias(String alias, String newAlias) {
        return new Builder().renameAlias(alias, newAlias);
    }


    public static class Builder {

        private Map<String, String> aliasConversionMap = new HashMap<String, String>();


        public Builder renameAlias(String alias, String newAlias) {
            aliasConversionMap.put(alias, newAlias);
            return this;
        }


        public AliasToMapTransformer build() {
            return new AliasToMapTransformer(aliasConversionMap);
        }
    }
}

在相關主題上,轉義列名中的保留字就像使用表別名前置一樣簡單。 沒有反引號,方括號等。只需更換

select where from mytable

通過:

select t.where from mytable t

(注意:我不是說將“where”作為列名稱是個好主意;-)

后面的抽搐概念在hibernate中起作用..不幸的是,這只有在你完成注釋配置時才有效...

您可以嘗試以不同的方式執行此操作(無需注釋)。

Query q = session.createQuery("select new User (u.id, u.name, u.object) from User u").list();

在這里,您需要創建一個使用中的構造函數,該構造函數接受id,name,object元素並按此順序。

反引號不能用於別名嗎? Hibernate文檔說它們將它們用於字段。

其他問題:

  • 另一個價值可能嗎?
  • 為什么地圖(它也包含原始值)而不是List? 可以從原始對象中檢索Id和Name。

好吧,我真的遲到了這個問題,但由於上述解決方案對我不起作用,我想我會發布解決方案。

我們的問題是一個名為“行”的字段。 取決於 xml 或注釋的解決方案是:

@Column(name="`row`")
private String row;
<property name="row" column="`row`" access="field" not-null="true"/>

暫無
暫無

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

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