- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下用于过滤订单的 CriteriaQuery。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<OrderReducedDTO> cq = cb.createQuery(OrderReducedDTO.class);
Root<Order> root = cq.from(Order.class);
Join<Order, Customer> joinCustomer = root.join(Order_.customer);
Join<Order, Shipment> joinShipment = root.join(Order_.shipment);
Join<Shipment, Carrier> joinCarrier = joinShipment.join(Shipment_.carrier);
Join<Order, Payment> joinPayment = root.join(Order_.payment);
Join<Payment, PaymentMethod> joinPaymentMethod = joinPayment.join(Payment_.paymentMethod);
Join<Shipment, Country> joinCountry = joinShipment.join(Shipment_.country);
cq.select(cb.construct(
OrderReducedDTO.class,
root.get(Order_.id),
root.get(Order_.incrementId),
root.get(Order_.state),
root.get(Order_.couponCode),
root.get(Order_.totalDiscount),
root.get(Order_.total),
root.get(Order_.originChannel),
root.get(Order_.branchOffice),
joinCarrier.get(Carrier_.carrierCode),
cb.function("CONCAT_WS", String.class,
cb.literal(","),
joinShipment.get(Shipment_.streetName),
joinShipment.get(Shipment_.streetNumber),
joinShipment.get(Shipment_.city),
joinCountry.get(Country_.name),
joinShipment.get(Shipment_.zipCode)
),
joinPaymentMethod.get(PaymentMethod_.code),
joinPayment.get(Payment_.paymentDate),
root.get(Order_.createdAt),
root.get(Order_.updatedAt),
root.get(Order_.externalId),
joinCustomer.get(Customer_.fullName)
));
... filters and predicates...
给我带来麻烦并导致抛出 NPE 的部分是这个
cb.function("CONCAT_WS", String.class,
cb.literal(","),
joinShipment.get(Shipment_.streetName),
joinShipment.get(Shipment_.streetNumber),
joinShipment.get(Shipment_.city),
joinCountry.get(Country_.name),
joinShipment.get(Shipment_.zipCode)
)
更具体地说,当我使用 CONCAT_WS
函数时。如果我使用 CONCAT
,它会起作用。这是我得到的堆栈跟踪:
java.lang.NullPointerException: null
at org.hibernate.hql.internal.NameGenerator.generateColumnNames(NameGenerator.java:27)
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.generateColumnNames(SessionFactoryHelper.java:434)
at org.hibernate.hql.internal.ast.tree.SelectClause.initializeColumnNames(SelectClause.java:270)
at org.hibernate.hql.internal.ast.tree.SelectClause.finishInitialization(SelectClause.java:260)
at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:255)
at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:1026)
...
这是我的 OrderReducedDTO
@Getter
public class OrderReducedDTO {
@JsonProperty("order_id")
private Integer orderId;
@JsonProperty("increment_id")
private String incrementId;
private OrderStates state;
@JsonProperty("coupon_code")
private String couponCode;
@JsonProperty("total_discount")
private BigDecimal totalDiscount;
private BigDecimal total;
@JsonProperty("origin_channel")
private String originChannel;
@JsonProperty("branch_office")
private String branchOffice;
@JsonProperty("shipping_method")
private String shippingMethod;
@JsonProperty("shipping_address")
private String shippingAddress;
@JsonProperty("payment_method")
private String paymentMethod;
@JsonProperty("payment_date")
private Timestamp paymentDate;
@JsonProperty("created_at")
private Timestamp createdAt;
@JsonProperty("updated_at")
private Timestamp updatedAt;
@JsonProperty("external_id")
private String externalId;
@JsonProperty("customer_full_name")
private String customerFullName;
@Setter
private List<OrderProductReducedDTO> products;
public OrderReducedDTO(Integer orderId,
String incrementId,
OrderStates state,
String couponCode,
BigDecimal totalDiscount,
BigDecimal total,
String originChannel,
String branchOffice,
String shippingMethod,
String shippingAddress,
String paymentMethod,
Object paymentDate,
Object createdAt,
Object updatedAt,
String externalId,
String customerFullName) {
this.orderId = orderId;
this.incrementId = incrementId;
this.state = state;
this.couponCode = couponCode;
this.totalDiscount = totalDiscount;
this.total = total;
this.originChannel = originChannel;
this.branchOffice = branchOffice;
this.shippingMethod = shippingMethod;
this.shippingAddress = shippingAddress;
this.paymentMethod = paymentMethod;
this.paymentDate = (Timestamp) paymentDate;
this.createdAt = (Timestamp) createdAt; //https://hibernate.atlassian.net/browse/HHH-4179
this.updatedAt = (Timestamp) updatedAt;
this.externalId = externalId;
this.customerFullName = customerFullName;
}
}
我主要想知道我是否正确使用了function
方法。我想我是因为 CONCAT
有效。
最佳答案
在 Hibernate 中调试了几个小时后,我终于找到了问题的根源:
org/hibernate/hql/internal/ast/tree/ConstructorNode.java
private Type[] resolveConstructorArgumentTypes() throws SemanticException {
SelectExpression[] argumentExpressions = this.collectSelectExpressions();
if (argumentExpressions == null) {
return new Type[0];
} else {
Type[] types = new Type[argumentExpressions.length];
for(int x = 0; x < argumentExpressions.length; ++x) {
types[x] = argumentExpressions[x].getDataType();
}
return types;
}
}
argumentExpressions[x].getDataType()
正在返回 null
。
我用谷歌搜索,发现这可能是由于 Hibernate 不知道给定 SQL 函数的实际返回类型(显然它只知道最常见的)。然后我关注了this answer并像这样实现了自定义 MetadataBuilderContributor
:
public class SqlFunctionsMetadataBuilderContributor implements MetadataBuilderContributor {
@Override
public void contribute(MetadataBuilder metadataBuilder) {
metadataBuilder.applySqlFunction(
"concat_ws",
new StandardSQLFunction("concat_ws", StandardBasicTypes.STRING)
);
}
}
然后在我的 application.properties 中添加:
spring.jpa.properties.hibernate.metadata_builder_contributor=ar.com.glamit.glamitoms.config.hibernate.SqlFunctionsMetadataBuilderContributor
重新启动应用后,argumentExpressions[x].getDataType()
现在返回一个 StringType
并且 NullPointerException
消失了。
关于java - 带有 CONCAT_WS 函数的 JPA CriteriaBuilder 抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64882431/
我正在尝试更改以下 HQL 以使用 JPA 标准: select distinct d from Department d left join fetch d.children c where d.p
我对 CriteriaBuilder API 有疑问: 我想计算一列的结果,并返回该计数的结果以及该列的不同值的列表。 | Table_fruit | count(Tab
有什么区别: 在 Builder 上的第一次测试运行: Predicate predicate = root.get(PersonEntity_.name).in(names); criteriaBu
我正在开发一个经常使用 CriteriaBuilder.Coalesce 的大型代码库。和 Root 。例如, criteriaBuilder.coalesce(root.get('adjustedW
我有这样的代码 @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) public Re
我必须重写一些代码,但在互联网上找不到正确的信息。原始部分如下所示: String query = "select * from sublog_type_map_v where 1 = 1"; if
这是我从 CriteriaBuilder 获得的 hibernate 查询: select generatedAlias0 from MyObject as generatedAlias0 where
SELECT * FROM Emp_Main WHERE status = 'QUIT' AND to_Char(effective_date,'YYYY')= '2018'; 在此示例中,我已将代码
我正在尝试使用 @Embeddable与 CriteriaBuilder过滤父结果 Entity基于嵌入的属性。我使用 Eclipse Link 来生成元数据类。 这是嵌入的类/实体: @Embedd
谁能提供一个如何使用 CriteriaBuilder 编写案例查询的示例? 最佳答案 以下是使用 CriteriaBuilder 的示例 case 表达式(这适用于 JPA 2): Hashtable
我想写这个SQL查询 SELECT * FROM A LEFT OUTER JOIN B ON A.IDRESOURCE=B.IDRESOURCE AND B.IDLANGUAGE=22; 使用 J
我想将日期与数据库中的时间戳进行比较。我目前使用的是 predicates.add(criteriaBuilder.between(eventRoot.get("time"), dBegin, dEn
使用 Criteriabuilder 编写查询时,如何在两列上添加相等条件?例如: CriteriaBuilder cb = entityManager.getCriteriaBuilder(); C
我有一个实体 @Entity @Table(name = "`petition`") @Getter @Setter public class Petition extends Auditable {
嗯,我正在使用 CriteriaBuilder 和 PredicateList 来处理 JPA 并从数据库中提取信息,事实是它包含带重音的数据,我需要进行搜索,即使我搜索不带重音的单词,我也会找到带重
我有一个要附加到 or 条件中的列表 我面临的问题是当我遍历 List 并将其添加到 CategoryBuilder 然后它采用最后一个 Predicate 例子如下: public static S
我正在尝试计算给定的纬度/经度和距离,并且只返回落在该圆距离内的行(数据库也有纬度/经度坐标)。我不知道的是我会怎么做。我目前正在使用 native SQL 并使用纯文本和计算它的半正弦公式,如果我是
我正在尝试了解如何从联接中仅选择记录上的最新日期。我的 People 实体与 Membership 实体相结合。我的成员(member)实体有一个 RefMembershipStatus 实体。我试图
我目前正在这样。 final CriteriaBuilder builder = ...; final boolean flag = ...; if (flag) { builder.isTr
我有这样的 SQL 语句: SELECT * FROM person inner join (select max(validityId) as maxID from person group by
我是一名优秀的程序员,十分优秀!