【问题标题】:SPRING /JPA - JPQL and Hibernate - repository - can I make a condition on child elements?SPRING /JPA - JPQL 和 Hibernate - 存储库 - 我可以对子元素设置条件吗?
【发布时间】:2019-01-12 14:31:27
【问题描述】:

我有拥有优惠券集合的客户@Entity -(加入表 Customer_Coupons)。

我想创建一个 JPQL 查询,它只返回特定类型的客户优惠券。这意味着条件在集合元素上。

这可能吗?

这是客户实体:

@Entity
@Table(name = "Customers")
public class Customer {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "cust_name")
private String custName;


@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "customer_coupon", joinColumns = @JoinColumn(name = 
"cust_id"), // this class
        inverseJoinColumns = @JoinColumn(name = "coupon_id")
)

Collection<Coupon> coupons; 
private Set<Coupon> coupons = new HashSet<>();
}

【问题讨论】:

  • 是的,你可以...
  • 您想要什么类型的条件?您可以过滤与客户对象相关的集合,但最好使用一些带有“WHERE”语句的 sql 查询

标签: java spring-boot jpa jpql


【解决方案1】:

指定 JPQL NamedQuery "Customer.findAllWithCouponType"

@Entity
@NamedQueries(
        @NamedQuery(
                name = "Customer.findAllWithCouponType",
                query = "SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.coupons cp WHERE cp.type = :type"
        )
)
@Table(name = "Customers")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "cust_name")
    private String custName;


    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "customer_coupon", joinColumns = @JoinColumn(name =
            "cust_id"), // this class
            inverseJoinColumns = @JoinColumn(name = "coupon_id")
    )
    private List<Coupon> coupons;
}

然后在repository类中创建NamedQuery("Customer.findAllWithCouponType"),并设置参数("type")

@Service("customerRepository")
@Repository
@Transactional
public class CastomerRepository implements IRepository<Customer> {

    @PersistenceContext(unitName = "entityManagerFactory")
    private EntityManager em;

    @Override
    @Transactional(readOnly = true)
    public List<Customer> findAllWithCouponType(String type) {
        return em.createNamedQuery("Customer.findAllWithCouponType", Customer.class)
            .setParameter("type", type).getResultList();
    }
}

【讨论】:

  • 非常感谢您的回答,我会试试的。
猜你喜欢
  • 2012-07-15
  • 2021-01-28
  • 1970-01-01
  • 2019-10-27
  • 2016-12-22
  • 2019-08-08
  • 2015-12-23
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多