相关疑难解决方法(0)

如何在JOIN中使用JPA Criteria API

  • 我有五个表:公司,产品/服务,地址,国家和城市.
  • 公司可以在地址实体中拥有n个产品类别,1个地址,1个国家和1个城市.
  • 用户选择了"英格兰 - 利兹".
  • 我现在知道,我必须从数据库中选择所有城市是利兹的公司,并在这些公司的产品或服务中填充产品/服务清单.之后,用户可以从第三个列表中选择例如牙医.
  • 之后我知道Enlgand - 利兹 - 牙医和我必须填写最后一个列表与compenies(利兹的牙医)

public class Company implements java.io.Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Short companyId;
@OneToOne(cascade=CascadeType.PERSIST)
private Address address;
private String companyName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "company",cascade=CascadeType.PERSIST)
private Set<Product> products = new HashSet<Product>(0);
Run Code Online (Sandbox Code Playgroud)
public class Product implements java.io.Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "productId", unique = true, nullable = false)
private Integer productId;
private Short branchId;
private String productName;
private String sku;
private String category; ------> I am …
Run Code Online (Sandbox Code Playgroud)

jpa join

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

如何计算通用JPA DAO中JPA 2 CriteriaQuery的行数?

我是JPA的新手,想要实现一个通用的JPA DAO,需要找到查询结果集的行数来实现分页.搜索网络后,我找不到切实可行的方法.以下是许多文章中建议的代码:

public <T> Long findCountByCriteria(CriteriaQuery<?> criteria) {
    CriteriaBuilder builder = em.getCriteriaBuilder();

    CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);
    Root<?> entityRoot = countCriteria.from(criteria.getResultType());
    countCriteria.select(builder.count(entityRoot));
    countCriteria.where(criteria.getRestriction());

    return em.createQuery(countCriteria).getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)

但是,该代码在使用时不起作用join.有没有办法使用JPA Criteria API计算查询结果集的行数?

更新:这是创建CriteriaQuery的代码:

    CriteriaQuery<T> queryDefinition = criteriaBuilder.createQuery(this.entityClass);
    Root<T> root = queryDefinition.from(this.entityClass);
Run Code Online (Sandbox Code Playgroud)

并且可以将一些联接添加到根,直到执行查询为止:

public Predicate addPredicate(Root<T> root) {
                Predicate predicate = getEntityManager().getCriteriaBuilder().ge(root.join(Entity_.someList).get("id"), 13);
                return predicate;
}
Run Code Online (Sandbox Code Playgroud)

并且生成的异常如下:

org.hibernate.hql.ast.QuerySyntaxException:无效路径:'generatedAlias1.id'[从entity.Entity中选择count(generatedAlias0)为generatedAlias0,其中(generatedAlias0.id> = 13L)和((generatedAlias1.id <= 34L)) ]

其中generatedAlias1应该在Entity上,generatedAlias0应该在我加入的关联上.请注意,我正确实现了Join,因为当我执行不带计数查询的查询时,它执行时没有错误,并且Join正常工作但是当我尝试执行count查询时它会抛出异常.

java orm pagination jpa count

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

标签 统计

jpa ×2

count ×1

java ×1

join ×1

orm ×1

pagination ×1