Java 在hibernate中调用返回varchar的mysql函数

Java 在hibernate中调用返回varchar的mysql函数,java,mysql,string,hibernate,function,Java,Mysql,String,Hibernate,Function,我试图在hibernate中使用mysqlfind_in_setstring函数,但不幸的是,我无法使用它,甚至尝试创建这些寄存器函数 registerFunction("findInSet",newSQLFunctionTemplate(Hibernate.STRING,"FIND_IN_SET(?1,?2)")); registerFunction("findInSet",newSQLFunctionTemplate(Hibernate.INTEGER,"FIND_IN_SET(?1,?2)

我试图在hibernate中使用mysql
find_in_set
string函数,但不幸的是,我无法使用它,甚至尝试创建这些寄存器函数

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方言,但没有人在工作。有人能告诉我如何在hibernate中使用mysql字符串函数吗。或对上述寄存器功能的任何更改

提前感谢,

致以最良好的祝愿,
Raja.

如果函数返回
字符串或varchar
值,调用函数很简单

session.createSQLQuery(“选择我的超级链接(:param1)”)

其中my\u super\u fn是带有参数param1的函数名

要测试语法,请尝试以下代码,该代码将获取当前服务器日期

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

对于其他类型的函数,请参阅如何执行的问题。

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

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)");
这对我很有用:

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错误


另外,您显然应该覆盖适当的方言和包名。

您好,谢谢您的回复。但是您给出的想法在这种格式下不起作用。Query Query=this.entityManager.createQuery(“选择FIND_IN_SET()”)。你能告诉我如何在hibernate中使用实体管理器吗?你在使用JPA吗?你犯了什么错误?同时,你应该使用。