Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 传递根作为函数属性条件查询_Postgresql_Hibernate_Criteria - Fatal编程技术网

Postgresql 传递根作为函数属性条件查询

Postgresql 传递根作为函数属性条件查询,postgresql,hibernate,criteria,Postgresql,Hibernate,Criteria,我有一个postgreSQL自定义函数,它需要一个类型为“my_entity”的属性 在SQL中,我可以正常调用此函数: select my_function(t) from my_entity t; 现在我需要的是使用CriteriaQuery调用同一个函数,但是当我尝试时,hibernate会用我的_table.id而不是元组本身生成一个SQL语句: select my_function(my_entity0_.id) from my_entity my_entity0_; 我的代码:

我有一个postgreSQL自定义函数,它需要一个类型为“my_entity”的属性

在SQL中,我可以正常调用此函数:

select my_function(t) from my_entity t;
现在我需要的是使用CriteriaQuery调用同一个函数,但是当我尝试时,hibernate会用我的_table.id而不是元组本身生成一个SQL语句:

select my_function(my_entity0_.id) from my_entity my_entity0_;
我的代码:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb.createQuery(MyEntity.class);
Root<MyEntity> root = cq.from(MyEntity.class);

Expression<String> myFunction= cb.function("my_function", String.class, root);
cq.select(myFunction);

return em.createQuery(cq).getResultList();

如何将参数正确传递给此函数?

要使用CriteriaBuilder函数传递my_entity0.id,可以尝试以下代码

Expression<String> myFunction= cb.function("my_function", String.class, root.get("id"));
表达式myFunction=cb.function(“my_函数”、String.class、root.get(“id”);
我刚刚放弃并创建了一个新函数,它需要N个参数,而不是实体/行:

Expression<String> calcSubStatus = cb.function("my_new_function", String.class,
                attr1, attr2, attr3, attr4, attr5, attrN);

我不需要id,只要别名“myentity”就可以了,请尝试使用root.alias(“myentity”)。hibernate使用别名传递'myentity',但使用引号,我得到了一个错误,因为函数不需要字符串参数。请尝试获取别名并将其作为字符串alias=root.alias(“myentity”).getAlias()传递给函数;将此别名传递给cb.function(“我的函数”,String.class,别名);
Expression<String> calcSubStatus = cb.function("my_new_function", String.class,
                attr1, attr2, attr3, attr4, attr5, attrN);
CREATE OR REPLACE FUNCTION my_new_function(
      IN "ATTR1" character varying,
      IN "ATTR2" character varying,
      IN "ATTR3" character varying,
      IN "ATTR4" character varying,
      IN "ATTR5" character varying,
      IN "ATTRN" character varying)
RETURNS character varying
LANGUAGE 'plpgsql'

AS $BODY$BEGIN

    ... some logic ...

    RETURN some_calculated_result;

END;$BODY$;