使用 Spring boot,我正在處理一個業務用例,我需要根據配置修改運行時生成的 JPA 查詢。
例如 .. 如果 JPA 生成的查詢是
select * from customers where id=1234
我想在運行時修改它,比如基于用戶登錄的背景關系。(背景關系有一個屬性業務單元)如下所示..
select * from customers where id=1234 and ***business_unit='BU001'***
由于某些業務用例限制,我不能進行靜態型別查詢。
使用 Spring Boot 和 Postgres SQL。
謝謝你的幫助 !!
uj5u.com熱心網友回復:
試試JPA 標準生成器,它可以讓您以編程方式創建動態查詢。
看看這個帖子
uj5u.com熱心網友回復:
是什么阻止您從背景關系中提取業務部門并將其傳遞給查詢?
如果你有這個物體
@Entity
CustomerEntity {
Long id;
String businessUnit;
//geters setters
}
您可以將此查詢添加到您的 JPA 存盤庫界面:
CustomerEntity findByIdAndBusinessUnit(Long id, String businessUnit)
這將生成以下"where"子句:
… where x.id=?1 and x.businessUnit=?2
有關完整的檔案,請查看Spring Data Jpa Query 創建指南。
uj5u.com熱心網友回復:
你會做這樣的事情,這可以讓你在查詢中動態定義你需要的額外謂詞。如果您不想在查詢中包含所有條件@Query
下面的示例僅添加了一個謂詞。
import java.util.ArrayList;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
import study.spring.data.jpa.models.TicketPrice;
@Component
public class TricketPriceCriteriaRepository {
@Autowired
TicketPriceJpaRepository ticketPriceJpaRepository;
public List<TicketPrice> findByCriteria(int price) {
return ticketPriceJpaRepository.findAll(new Specification<TicketPrice>() {
@Override
public Predicate toPredicate(Root<TicketPrice> root, CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if (price > 0) {
predicates.add(
criteriaBuilder.and(criteriaBuilder.greaterThan(root.get("basePrice"), price)));
}
// Add other predicates here based on your inputs
// Your session based predicate
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
});
}
}
您的基礎存盤庫就像
// Other imports
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface TicketPriceJpaRepository
extends JpaRepository<TicketPrice, Long>, JpaSpecificationExecutor<TicketPrice> {}
該模型包括 basePrice
@Column(name = "base_price")
private BigDecimal basePrice;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454162.html
上一篇:為什么當我嘗試將我的intpid傳遞給我的OrderDao類并出現問題時?
下一篇:單擊其他地方后如何觸發命令?
