我试图在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));
使用mysql方言,但没有人是工作..谁能告诉我如何使用mysql字符串函数在hibernate。或对上述寄存器函数的任何更改
Thanks in Advance,
最诚挚的问候,拉贾。
如果您的函数返回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);
对于其他类型的函数,请参阅此处的问题,以了解如何执行
这个适合我:
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错误。
当然,您应该覆盖适当的方言和包名。
通过扩展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));
}
}
,在query
中使用new Query(" >= date_sub_interval(CURRENT_DATE(),1, DAY)");