Java JPA使用between子句查询集合

Java JPA使用between子句查询集合,java,jpa,persistence,criteria,Java,Jpa,Persistence,Criteria,我的实体有另一个实体的集合,我需要对其执行介于标准之间的操作。 我不想使用本机查询。 我正试图使用CriteriaAPI实现这一点 下面是我的实体的一个简短片段 @Entity @Table(name = "ref_dates") public class Dates{ @Id @Column(name = "ID") private int id; @OneToMany(fetch = FetchType.EAGER) @JoinTable(

我的实体有另一个实体的集合,我需要对其执行
介于
标准之间的操作。
我不想使用本机查询。
我正试图使用CriteriaAPI实现这一点

下面是我的实体的一个简短片段

@Entity
@Table(name = "ref_dates")
public class Dates{
    @Id
    @Column(name = "ID")
    private int id;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinTable(
    name="ref_dates_prg",
    joinColumns = @JoinColumn( name="DATE_PRG_ID"),
    inverseJoinColumns = @JoinColumn( name="DATE_ID")
 )    
 private Set<DateInfo> dates;

假设您确实正确地映射了集合,那么您似乎缺少的主要部分是
连接

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Dates> query = cb.createQuery(Dates.class);

Root<Dates> root = query.from(Dates.class);
Join<Dates, DateInfo> infos = root.join("dates", JoinType.LEFT);

query.distinct(true);
em.createQuery(query.where(cb.between(infos.<Integer>get("id"), 1, 10))).getResultList();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Dates.class);
Root=query.from(Dates.class);
Join-infos=root.Join(“日期”,JoinType.LEFT);
query.distinct(true);
em.createQuery(query.where(cb.between(infos.get(“id”),1,10)).getResultList();

当然,您可以在我使用字符串的地方替换元模型字段(这也将不再需要这个丑陋的
选择器-假设您的id是整数)。

这是您的完整实体吗?因为现在,您的
集合
将作为blob列
日期
,而不是FK映射。谢谢,我已经编辑了我的原始代码,以包含更合适的映射。联接已在集合的实体中指定。@user3536652是的,但我指的是查询中使用的
join
接口(此处名为
infos
)。如果这对你不起作用,你能用你尝试过的条件查询编辑你的帖子吗?哪一个不起作用?谢谢@Mabi,这将让我开始。将向您更新结果。未按预期工作,它将返回更多包含附加联接的行。该集合包含所有的值,而不是筛选出的值(是否应该是筛选集合?)我已添加了我的条件生成代码。@user3536652我已将我的帖子编辑为只包含
不同的
行。这就解决了你的第一个问题。至于第二点:Hibernate返回集合中的所有元素是正常的行为。您需要一个额外的java结果转换器或过滤器代码。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Dates> query = cb.createQuery(Dates.class);

Root<Dates> root = query.from(Dates.class);
Join<Dates, DateInfo> infos = root.join("dates", JoinType.LEFT);

query.distinct(true);
em.createQuery(query.where(cb.between(infos.<Integer>get("id"), 1, 10))).getResultList();