【问题标题】:calling a mysql function returning varchar in hibernate在休眠中调用返回 varchar 的 mysql 函数
【发布时间】:2011-12-02 11:34:19
【问题描述】:

我正在尝试在休眠中使用 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 但没有人在工作..谁能告诉我如何在休眠中使用 mysql 字符串函数。或对上述寄存器功能的任何更改。

提前致谢,

最好的问候, 拉贾。

【问题讨论】:

    标签: java mysql string hibernate function


    【解决方案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,了解如何操作。

    【讨论】:

    • 嗨,感谢您的回复..但是您给出的想法不适用于这种格式。 Query query = this.entityManager.createQuery("select FIND_IN_SET()")..你能告诉我如何在休眠中使用实体管理器吗?
    • 您在使用 JPA 吗?你得到什么错误?同时你应该使用 createNativeQuery.
    【解决方案2】:

    这对我有用:

    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(...) &gt; 0。在没有比较运算符的情况下使用 find_in_set() 将无法执行并出现 AST 错误。

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

    【讨论】:

      【解决方案3】:

      通过扩展 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)");
      

      【讨论】:

        猜你喜欢
        • 2016-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多