调用一个mysql函数在hibernate中返回varchar

时间:2011-12-02 11:34:20

标签: java mysql string hibernate function

我试图在hibernate中使用mysql find_in_set字符串函数,但遗憾的是我无法使用它,甚至尝试创建这些寄存器函数

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));

使用mysqldialect但没有人工作..任何人请告诉我如何在hibernate中使用mysql字符串函数。或上述注册函数的任何更改。

先谢谢,

最诚挚的问候, 拉加。

3 个答案:

答案 0 :(得分:1)

如果您的函数返回string or varchar值,则调用函数很简单。

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

my_super_fn 是指参数 param1 的功能名称。

要测试语法,请尝试使用此代码获取当前服务器日期。

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

对于其他类型的函数,请参阅问题here,了解如何执行此操作。

答案 1 :(得分:0)

通过扩展mysqldialect创建了一个类,如下所示

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));
}

}

并在查询

中使用它
new Query(" >= date_sub_interval(CURRENT_DATE(),1, DAY)");

答案 2 :(得分: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)");
    }
}

并在JPA配置文件中设置:

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

最后,对于find_in_set,您应确保条件查询为find_in_set(...) > 0。在没有比较运算符的情况下使用find_in_set()将无法执行AST错误。

此外,您显然应该覆盖相应的方言和包名称。