postgresql 通过@Formula防止Hibernate在子选择中使用表别名

mitkmikd  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(1)|浏览(97)

我的实体中有此定义

@Formula(value = "(select coalesce(sum(v.value::float),0) from jsonb_each(urlaub_korrekturen) as \"v\")")
 private Float urlaubKorrektur;

Hibernate生成这个选择查询,如果我删除子选择中的p1_0,它将完美地工作。有什么方法可以告诉Hibernate忽略表别名吗?

select
m1_0.nachname,
m1_0.vorname,
p1_0.monat,
    (
        select coalesce(sum(v.value::float), 0) from jsonb_each(p1_0.urlaub_korrekturen) as p1_0."v"
    ),
    p1_0.urlaub_korrekturen,
    p1_0.urlaub_monatssaldo,
    p1_0.urlaub_neu
from
    erp.personal_zeiterfassung_monatsabschluss p1_0
left join erp.personal_mitarbeiter m1_0 on
    m1_0.id = p1_0.mitarbeiter_id

或者,是否有其他/更好的方法来获取josnb字段中所有值的总和?

nx7onnlm

nx7onnlm1#

您绝对应该编写一个HQL查询来执行此操作,并且不要用它来污染您的实体模型。
编写自定义Hibernate函数:

public class MySum implements SQLFunction {

    @Override
    public boolean hasArguments() {
        return true;
    }

    @Override
    public boolean hasParenthesesIfNoArguments() {
        return true;
    }

    @Override
    public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
        return StandardBasicTypes.FLOAT;
    }

    @Override
    public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) throws QueryException {
        String query = args.get(args.size() - 1);
        return "(select coalesce(sum(v.value::float), 0) from jsonb_each(" + args.get(0) + ") as v)";
    }
}

然后您可以这样查询:

select e, my_sum(e.urlaubKorrekturen) from MyEntity e

相关问题