2011-12-02 73 views
1

我試圖使用mysql find_in_set字符串函數在休眠,但遺憾的是我不能能夠使用它,甚至用mysqldialect但沒有人創造這些寄存器的功能調用MySQL的功能處於休眠

registerFunction("findInSet",newSQLFunctionTemplate(Hibernate.STRING,"FIND_IN_SET(?1,?2)")); 
registerFunction("findInSet",newSQLFunctionTemplate(Hibernate.INTEGER,"FIND_IN_SET(?1,?2)")); 
registerFunction("findInSet",new StandardSQLFunction("find_in_set", Hibernate.INTEGER)); 

試圖返回VARCHAR正在工作......任何人都可以告訴我如何在hibernate中使用mysql字符串函數。或對上述寄存器功能的任何更改。

由於事先

最好的問候, 拉賈。

回答

0

通過像圖所示

public class MySqlDialectExtended extends MySQLDialect { 

public MySqlDialectExtended() { 
    super(); 
    registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)")); 
    registerFunction("date_sub_interval", new SQLFunctionTemplate(Hibernate.DATE, "DATE_SUB(?1, INTERVAL ?2 ?3)")); 
    registerFunction("weekofyear", new StandardSQLFunction("weekofyear", Hibernate.INTEGER)); 
    registerFunction("group_concat", new StandardSQLFunction("group_concat", Hibernate.STRING)); 
} 

}

延伸mysqldialect創建一個類,並在查詢中使用它像這樣

new Query(" >= date_sub_interval(CURRENT_DATE(),1, DAY)"); 
1

如果函數返回string or varchar值,調用函數很簡單。

session.createSQLQuery("select my_super_fn(:param1)")

my_super_fn與參數參數1你的函數的名稱。

要測試語法,請嘗試使用此代碼獲取當前服務器日期。

Date d = (Date)session.createSQLQuery("select CURDATE()").uniqueResult(); 
System.out.println(d); 

對於其他類型的功能,請參考有關如何操作的問題here

+0

嗨,感謝您的答覆..但你給的想法是不是在這種格式工作。查詢查詢= this.entityManager.createQuery(「選擇FIND_IN_SET()」)..你可以給我一個想法如何使用與實體經理在休眠。 – user503285

+0

您使用的是JPA嗎?你得到什麼錯誤?與此同時,您應該使用** [createNativeQuery](http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html#createNativeQuery(java.lang.String))**。 – ManuPK

+0

我已經通過使用createnativequery解決了上述問題 – user503285

0

這個工作對我來說:

package mypackage; 

import org.hibernate.dialect.MySQL5InnoDBDialect; 
import org.hibernate.dialect.function.SQLFunctionTemplate; 
import org.hibernate.type.BooleanType; 

public class CustomSqlDialect extends MySQL5InnoDBDialect { 
    public CustomSqlDialect() { 
     registerFunction("find_in_set", new SQLFunctionTemplate(IntegerType.INSTANCE, "find_in_set(?1, ?2)"); 
    } 
} 

並設置th在你的JPA配置文件:

<property name="hibernate.dialect" value="mypackage.CustomSqlDialect"/> 

最後,find_in_set你應該確保查詢條件爲find_in_set(...) > 0。如果沒有比較運算符,則使用find_in_set()將無法​​執行AST錯誤。

此外,你應該顯然覆蓋適當的方言和包名稱。