标签: criteria-api

JPA 2 + Criteria API +获取子查询中最旧的元素

我有两个实体(DatasetItem),第一个实体包含后者的列表.

@Entity
class Dataset {
    @Id long id;
    List<Item> items;
}

@Entity
class Item {
    @Id long id;
    @Temporal Date date;
    String someCriteria;
}
Run Code Online (Sandbox Code Playgroud)

现在我期待的任何数据集,这与引用的项目someCriteria ="X"作为最古老的项目中数据集的列表(它的日期是在此之前,此数据集所引用的所有其他人的).

这应该与JPA-2.0的Criteria API一起使用,但作为SQL查询的答案也可以.

这就是它现在的样子:

Subquery<Item> _subquery = p_criteria.subquery(Item.class);
Root<Item> _itemRoot = _subquery.from(Item.class);
_subquery.select(_itemRoot);

// correlate
_subquery.correlate(_datsetRoot);

// type check
Predicate _typeP = p_builder.equal(_itemRoot.get(Item_.someCriteria), "x");

<additional predicates>
...

// reference check
_subquery.where(_typeP);

return p_builder.exists(_subquery);
Run Code Online (Sandbox Code Playgroud)

我想创建子查询,按日期排序并检查第一个子查询.不幸的是,JPA-2.0不允许在子查询(或连接)中进行排序(据我所见).我的第二个想法是获取MAX(date),大多数数据库应该支持这个想法.同样如此,支持MAX,ABS,......仅适用于数字.

编辑:使用一个已排序的子查询,它看起来像这样(MSSQL):

SELECT d.id
FROM Dataset d
WHERE EXISTS …
Run Code Online (Sandbox Code Playgroud)

java hibernate criteria-api jpa-2.0

4
推荐指数
1
解决办法
5853
查看次数

Criteria API组合AND/OR

我正在努力使用Criteria API创建查询.以下SQL查询返回我需要的结果:

SELECT * FROM MODEL WHERE MANUFACTURER_ID = 1 AND SHORTNAME LIKE '%SF%' OR LONGNAME LIKE '%SF%';
Run Code Online (Sandbox Code Playgroud)

我使用条件API编写了以下代码:

public List<Model> findAllByManufacturer(Manufacturer manufacturer,
        String pattern) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Model> cq = cb.createQuery(Model.class);
    Root<Model> m = cq.from(Model.class);
    cq.select(m);
    Join<Model, Manufacturer> mf = m.join("manufacturer");
    Predicate p = cb.equal(mf.get("id"), manufacturer.getId());
    p = cb.and(cb.like(cb.upper(m.<String>get("shortName")),
            pattern.toUpperCase()));
    p = cb.or(cb.equal(cb.upper(m.<String>get("longName")),
            pattern.toUpperCase()));
    cq.where(p);
    return em.createQuery(cq).getResultList();
}
Run Code Online (Sandbox Code Playgroud)

当我从逻辑上思考它时,它应该工作:

Predicate p = cb.equal(mf.get("id"), manufacturer.getId());
Run Code Online (Sandbox Code Playgroud)

WHERE MANUFACTURER_ID = 1

p = cb.and(cb.like(cb.upper(m.<String>get("shortName")),
                pattern.toUpperCase()));
Run Code Online (Sandbox Code Playgroud)

和SHORTNAME一样'%SF%'

p = cb.or(cb.equal(cb.upper(m.<String>get("longName")),
                pattern.toUpperCase())); …
Run Code Online (Sandbox Code Playgroud)

java jpa java-ee criteria-api

4
推荐指数
1
解决办法
5381
查看次数

使用JPA Criteria-API从连接表中选择对象

我正在与以下问题争吵两天,希望你能给我一个正确的方向.我在研究过程中发现的教程和示例总是只显示如何在标准api中轻松加入工作.首先,我有两个班:

@Entity
public class Offer {

  private String name;
  @ManyToOne private Location location;
  private String tags;
}
Run Code Online (Sandbox Code Playgroud)

@Entity
public class Location {
  private String name;
  private string tags;
}
Run Code Online (Sandbox Code Playgroud)

因为我需要避免循环引用,所以这些类之间的连接只是单向的.这个类中有很多其他属性,我想根据我的搜索过滤器构建动态查询.以下SQL语句将解释我喜欢做什么:

SELECT l 
FROM Offer o 
JOIN o.location l
WHERE o.tags LIKE :sometag AND l.tags LIKE :someothertag
Run Code Online (Sandbox Code Playgroud)

用标准api实现这个后,我得到了这段代码:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Location> criteriaQuery = criteriaBuilder.createQuery(Location.class);
criteriaQuery = criteriaQuery.distinct(true);
Join location;
ArrayList<Predicate> whereList = new ArrayList<Predicate>();

// if filter by offer, use offer as main table and join location table …
Run Code Online (Sandbox Code Playgroud)

java jpa criteria-api

4
推荐指数
1
解决办法
7705
查看次数

使用 JPA Criteria API 查询 Enum 的 ElementCollection

我正在为汽车经销商开发 Web 应用程序。我有一个包含一组安全枚举的字段的 Car 类。

public class Car {
    @Id
    @GeneratedValue
    private Long id;

    @NotNull(message = "{year}")
    @Min(value = 1950)
    @Max(value = 2020)
    @Column(nullable = false)
    private int year;

    @NotNull()
    @Column(nullable = false)
    private String make;

    @NotNull()
    @Column(nullable = false)
    private String model;

    @NotNull()
    @Min(value = 0)
    @Max(value = 1000000)
    @Column(nullable = false)
    private int kilometres;

    @Column(nullable = false)
    private int price;


    @NotNull()
    @Enumerated(EnumType.STRING)
    private Gearbox gearbox;

    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name="SECURITY")
    @Column(name="TYPE")
    private Set<Security> securityList = new HashSet<Security>();

    @NotNull() …
Run Code Online (Sandbox Code Playgroud)

java jpa criteria-api jpa-2.0

4
推荐指数
1
解决办法
1万
查看次数

JPA Criteria api通过嵌入式ID加入

我有以下实体:

@Entity
@Table(name = "place_revision")
public class PoiRevision {
    @OneToMany(mappedBy = "pk.revision", cascade = {CascadeType.ALL})
    private Collection<PoiRevisionCategory> categoryMapping;
    // ...
}

@Entity
@Table(name = "place_revision__category")
@AssociationOverrides({
    @AssociationOverride(name = "pk.revision",
        joinColumns = @JoinColumn(name = "place_revision_id")),
    @AssociationOverride(name = "pk.category",
        joinColumns = @JoinColumn(name = "category_id"))
})
public class PoiRevisionCategory {
    @EmbeddedId
    private PoiRevisionCategoryId pk = new PoiRevisionCategoryId();
    // ...
}

@Embeddable
public class PoiRevisionCategoryId implements Serializable {
    @ManyToOne
    private PoiRevision revision;
    @ManyToOne
    private Category category;
    // ...
}

@Entity
@Table(name = "category")
public …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa criteria-api spring-data

4
推荐指数
1
解决办法
4947
查看次数

在 JPA CriteriaQuery 中使用 @Embeddable 实体

假设我有以下示例实体 - 一个是@Embeddable嵌入在另一个中的@Entity

@Embeddable
public class ContactInfoEntity {

    @Column
    private String phone;

    @Column
    private String zipCode;
}

@Entity
@Table(name = "EMPLOYEE")
public class EmployeeEntity {

    @Id
    @Column(name = "EMPLOYEE_ID")
    private Long employeeId;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "phone",
                           column = @Column(name = "EMPLOYEE_PHONE")),
        @AttributeOverride(name = "zipCode",
                           column = @Column(name = "EMPLOYEE_ZIP_CODE"))
    })
    private ContactInfoEntity employeeContactInfo;
}
Run Code Online (Sandbox Code Playgroud)

openjpa-maven-plugin 生成的元模型类只包含一个employeeContactInfo变量,而不包含@AttributeOverride列。

现在假设我想这样做:

选择EMPLOYEE_IDEMPLOYEE_PHONE其中EMPLOYEE_ZIP_CODE等于“123456”

我如何将其创建为CriteriaQuery?

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); …
Run Code Online (Sandbox Code Playgroud)

java jpa criteria openjpa criteria-api

4
推荐指数
1
解决办法
7398
查看次数

如何使用 Criteria API 进行 JOIN ON 查询

由于 2.1 版 JPA 支持join on. 我发现了一些如何join on在 JPQL 中使用的示例,但没有用于 Criteria API,这是我的问题:

JOIN ON在 Criteria API 中实现的吗?如果是,任何人都可以提供示例吗?

java jpa criteria-api jpa-2.1

4
推荐指数
1
解决办法
5159
查看次数

带有 ElementCollection 的 JPA 标准

我有这样的事情:

@Entity
public class Person {

    @ElementCollection
    private List<String> emails;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如何将以下 JPQL 转换为条件查询:

select p from Person p
where exists (
    select 1 
    from p.emails e
    where e like :email
)
Run Code Online (Sandbox Code Playgroud)

java jpa jpql criteria-api

4
推荐指数
1
解决办法
2986
查看次数

使用 JPA Criteria API 生成正确和/或条件

我正在尝试在“或”和“和”条件中生成带有多个括号的查询,但没有生成内部括号。外部谓词的括号正确生成,但不是内部谓词的括号。代码:

    CriteriaBuilder criteriaBuilder = this.getEntityManager().getCriteriaBuilder();
    CriteriaQuery<ConfigurationKey> query = criteriaBuilder.createQuery(ConfigurationKey.class);
    Root<ConfigurationKey> configurationKeyRoot = query.from(ConfigurationKey.class);
    Join<ConfigurationKey, Customer> configurationKeyCustomerJoin = configurationKeyRoot.join(ConfigurationKey_.customer);

    final List<Predicate> predicates = new ArrayList<>();
    predicates.add(criteriaBuilder.equal(configurationKeyCustomerJoin.get(Customer_.externalId), customerId));
    predicates.add(criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.configType), configType));

    final List<Predicate> orPredicates = new ArrayList<>();
    keys.forEach((x, y) -> {
                orPredicates.add(
                        criteriaBuilder.and(
                                criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.keyType), x),
                                criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.keyValue), y)
                        )
                );
            }

    );

    predicates.add(criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()])));
    query.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
    query.select(configurationKeyRoot);
    TypedQuery<ConfigurationKey> typedQuery = this.getEntityManager().createQuery(query);
Run Code Online (Sandbox Code Playgroud)

生成的查询:

select
    configurat0_.id as id1_1_,
    configurat0_.createdAt as createdA2_1_,
    configurat0_.updatedAt as updatedA3_1_,
    configurat0_.configType as configTy4_1_,
    configurat0_.customerId as customer7_1_,
    configurat0_.keyType as keyType5_1_,
    configurat0_.keyValue as keyValue6_1_ …
Run Code Online (Sandbox Code Playgroud)

java sql jpa criteria-api jpa-2.0

4
推荐指数
1
解决办法
4791
查看次数

Java条件构建器查询不为null或为空

我正在尝试检查数据库中的列是否不是空字符串或不为null,但是我无法弄清楚如何使用条件构建器查询来获取实际对象。这个SQL的作品:

sampleName is not null and sampleName != ''
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用这样的条件构建器进行操作时:

//这是在私有方法filterBySampleNotEmpty中

cb.notEqual(root.get("sampleName"), "");
Run Code Online (Sandbox Code Playgroud)

在另一个方法中被此方法调用

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Sample> query = criteriaBuilder.createQuery(Sample.class);
Root model = query.from(Sample.class);
List<Predicate> predicates = new ArrayList<>();
predicates.add(filterBySampleNotEmpty(model, criteriaBuilder));
query.select(model).where(predicates.toArray(new Predicate[]{}));
Run Code Online (Sandbox Code Playgroud)

它仍然返回整个列表。

java jpa criteria-api

4
推荐指数
2
解决办法
2万
查看次数

标签 统计

criteria-api ×10

java ×10

jpa ×9

jpa-2.0 ×3

hibernate ×2

criteria ×1

java-ee ×1

jpa-2.1 ×1

jpql ×1

openjpa ×1

spring-data ×1

sql ×1