此答案适用于 Hibernate 5.0 直到 6.0。
首先你需要打开psql,使用\doS+ ->>找出运算符->>对应什么函数。在这种情况下jsonb_object_field_text 使您想要的条件jsonb_object_field_text(car0_.properties, 'country_of_manufacture') = 'US'。
现在您需要在 Hibernate 中注册该函数才能在 JPQL 中使用它。为此,您必须实现MetadataBuilderInitializer,假设您的包是com.mysite.util。
package com.mysite.util;
import org.hibernate.boot.MetadataBuilder;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.spi.MetadataBuilderInitializer;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StringType;
public class SQLFunctionContributor implements MetadataBuilderInitializer {
@Override
public void contribute(MetadataBuilder metadataBuilder, StandardServiceRegistry serviceRegistry) {
metadataBuilder.applySqlFunction("jsonb_object_field_text", new StandardSQLFunction("jsonb_object_field_text", StringType.INSTANCE));
}
}
最后一步是在资源文件夹中创建一个文本文件,路径如下:
META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer
文件必须包含新类的限定类名:
com.mysite.util.SQLFunctionContributor
现在您可以像这样在 JPQL 中使用该函数:
SELECT c FROM Car c WHERE c.yearOfManufacture < :year AND FUNCTION('jsonb_object_field_text', c.properties, 'country_of_manufacture') = :cc