gpt4 book ai didi

java - Hibernate 发出个人查询而不是加入

转载 作者:行者123 更新时间:2023-11-29 04:49:34 26 4
gpt4 key购买 nike

我有一个使用 Hibernate 和 JPA 的应用程序。我有 2 个对象(订单和产品)。他们联合起来,我可以获得我想要的信息,但它实际上发出了一个查询来获取我的所有订单,我在我的日志中得到了一堆查询来查找产品信息。我已经尝试了各种注释,但无法使其正常工作。任何帮助都会很棒。

这是我的代码:

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import javax.persistence.*;

@Entity
public class ProductFeedback implements ProductFeedbackInterface {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(columnDefinition="INT")
private Long id;
private String decision;
private String reportId;
...
@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "sku", referencedColumnName = "sku", insertable = false, updatable = false)
public Product product;

当我尝试查询此表时,我得到类似于以下查询的结果:

Hibernate: select top 50 productfee0_.id as id1_1_... from product_feedback productfee0_ where 1=1 and productfee0_.date_reported_date>=? and productfee0_.date_reported_date<=? and (productfee0_.decision=? or productfee0_.decision is null) and (productfee0_.dtype=? or productfee0_.dtype=?) and (productfee0_.severity in (0) or productfee0_.dtype<>?) order by productfee0_.date_reported_date desc

Hibernate: select ... from product product0_ where product0_.sku=?
Hibernate: select ... from product product0_ where product0_.sku=?

EDIT:::我也试过使用 @Fetch(FetchMode.JOIN) 但没有成功。

有什么想法吗?

编辑:

我们正在使用规范来构建查询:

public List<ProductFeedback> findAll(ProductFeedbackFilters     productFeedbackFilters) {

Page recordsPage = jpaRecordRepository.findAll(buildSpecifications(productFeedbackFilters), sortPageable(productFeedbackFilters.getLimit()));
return recordsPage.getContent();
}

这是一个示例...

private Specifications<ProductFeedback> defaultSpecifications() {
return where((queryRoot, query, criteriaBuilder) -> {
return criteriaBuilder.and(new Predicate[]{}); // Always true
});
}

private Specification<ProductFeedback> buildSpecifications(ProductFeedbackFilters filters) {
return new RecordSpecificationsBuilder(filters)
.onOrAfterStartDate()
.onOrBeforeEndDate()
.status()
.type()
.userQuery()
.severity()
.keyword()
.build();
}


public ProductFeedback findByReturnIdentifier(Integer catalogNumber, String commentType) {
return jpaRecordRepository.findOne((queryRoot, query, criteriaBuilder) ->
criteriaBuilder.and(criteriaBuilder.equal(queryRoot.get("catalogNumber"), catalogNumber), criteriaBuilder.equal(queryRoot.get("commentType"), commentType)));
}

最佳答案

您可以告诉持久性提供程序获取 ProductFeedback.product与您查询的关系Product实体,所以对 ProductFeedback 的简单查询对象

SELECT pf FROM ProductFeedback pf

会变成

SELECT pf FROM ProductFeedback pf LEFT JOIN FETCH pf.product

使用条件查询,假设您已经有一个 Root<ProductFeedback>对象,你可以告诉急切地获取关联的 ProductFeedback.product具有以下内容的对象:

productFeedbackRoot.fetch("product", JoinType.LEFT);

或者如果您有 JPA static metamodel classes generated :

productFeedbackRoot.fetch(ProductFeedback_.product, JoinType.LEFT);

关于java - Hibernate 发出个人查询而不是加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35927541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com