当前位置: 首页 > 知识库问答 >
问题:

JPA条件API中的订单自定义SQL

陶宜民
2023-03-14

谢谢你!

更新虽然@Tobias Liefke建议相当有趣,但我的SQL变化太大,无法为每个SQL创建一个函数类。我尝试实现一个函数类,并将SQL作为参数传递给它,但这不起作用(呈现的SQL用单引号括起来,因此它作为参数而不是作为生成的查询的一部分发送到数据库)

共有1个答案

宇文弘懿
2023-03-14

不能在JPQL或条件查询中使用SQL片段...

...除非...

JPA和Hibernate允许在其表达式中使用函数,例如:

... ORDER BY trim(entity.label) ASC
query.orderBy(criteriaBuilder.asc(
    criteriaBuilder.function("trim", String.class, root.get(ExampleEntity_.label))));

问题是,这实际上不是对SQL函数trim的调用,而是对必须注册的JPA函数的调用(Hibernate已经对最常见的SQL函数执行了这一操作)。

幸运的是,您可以在DialtResolver中定义自己的JPA函数:

public class MyDialectResolver implements DialectResolver {

  public Dialect resolveDialect(final DialectResolutionInfo info) {
    Dialect dialect = StandardDialectResolver.INSTANCE.resolve(info);
    dialect.registerFunction("myOrderFunction", ...);
    return dialect;
  }

}

registerfunction采用两个参数,第一个是JPA中函数的名称,另一个是到SQL的映射。

<persistence-unit name="database">
  <properties>
    <property name="hibernate.dialect_resolvers" 
              value="my.package.MyDialectResolver" />
  </properties>
</persistence-unit>

现在,您可以在包含巨大SQL的SQL server中创建自己的函数,并将其注册为function:

dialect.registerFunction("myOrderFunction", 
  new StandardSQLFunction("myOrderFunctionInSQL", StringType.INSTANCE));

也可以编写自己的映射,其中包含大量的SQL:

public class MyOrderFunction implements SQLFunction {

  public String render((Type firstArgumentType, List arguments,
      SessionFactoryImplementor factory) throws QueryException) {
    return my_huge_SQL;
  }

  // ...
}

并注册这一个:

dialect.registerFunction("myOrderFunction",  new MyOrderFunction());
@Formula("my huge SQL")
private String orderAttribute;

现在可以按以下属性排序:

... ORDER BY entity.orderAttribute ASC

Resp.

query.orderBy(criteriaBuilder.asc(root.get(ExampleEntity_.orderAttribute))));

我只推荐这个解决方案,如果您无论如何都需要您的模型中巨大的SQL的结果。否则,它只会污染实体模型,并将SQL添加到实体的每个查询中(除非您用@basic(fetch=fetchType.lazy)标记它,并使用字节码检测)。

 类似资料:
  • WooCommerce默认使用post ID作为订单号,post可以是订单,也可以是产品、页面、文章或其它的custom post type,所以这个ID是不连续的,人们并不能简单的通过订单号去猜测你网站的销量。但这也给商店管理者带来一定困扰,拿到一个订单号,却无法知道是什么时候的订单,是哪个商店的订单。所以要给订单号加前缀,前缀里带上具体时间和一个序号,就能解决这个问题。 用代码自定义订单号的显

  • 我正在使用WooCommerce REST API(http://woocommerce.github.io/woocommerce-rest-api-docs/#introduction),能够成功下载客户,订单等。 我的客户在结帐页面中添加了一些自定义字段,例如: 我希望在请求订单时能够获得这些自定义字段,例如: 目前,当我收到订单时,没有返回任何自定义字段。我试着加上 到请求URL,但这没有

  • 有部分条件如 target_os 在使用 rustc 时会隐式地提供,但是自定义条件必须使用 --cfg 标记来传给 rustc。 #[cfg(some_condition)] fn conditional_function() { println!("condition met!") } fn main() { conditional_function(); } 不使用自定义的

  • 以下仅在WooCommerce Admin single orders中显示产品自定义字段回答我的上一个问题,其中: 添加自定义SKU字段(ArticleID) 将自定义SKU(ArticleID)保存为隐藏订单项元数据 将自定义SKU(ArticleID)保存为手动订单的隐藏订单项元数据 然而,最后一部分(手动订单)似乎与我为网关费用添加的其他自定义代码相冲突: 当我尝试更新或更改已应用网关费用

  • 我正在使用WooCommerce REST API(http://WooCommerce.github.io/woocommerce-rest-api-docs/#introduction),并使用下面的示例在结帐页面中添加了一个新字段(shipping_phone): https://docs.woocommerce.com/document/tutorial-customising-check

  • 我有一家woocommerce商店,想定制我的产品。用户直接访问类别页面,无店铺存档页面。 你有没有什么好的方法来定制订单?我试着使用插件,并给那些产品一个编号。。。但一切都没有奏效。 问候