当前位置: 首页 > 知识库问答 >
问题:

JPA替代Hibernate投影。所有物

詹甫
2023-03-14

乡亲们!

试图限制从数据库中获取的列的数量,但发现:Hibernate Criteria查询以获取特定列

Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
      .add(Projections.property("Name"), "Name"))
    .setResultTransformer(Transformers.aliasToBean(User.class));

  List<User> list = cr.list();

当你使用Hibernate时,这非常好用,但我正试图用JPA做同样的事情(JPA提供者是Hibernate tho)。有可能用JPA来做吗?我是说用CriteriaBuilder限制列并映射到特定对象?

还有,我看到了这个:https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/query/criteria/Criteria.html

Hibernate offers an older, legacy org.hibernate.Criteria API which should be considered deprecated. No feature development will target those APIs. Eventually, Hibernate-specific criteria features will be ported as extensions to the JPA javax.persistence.criteria.CriteriaQuery. For details on the org.hibernate.Criteria API, see Legacy Hibernate Criteria Queries.

那么,似乎可以通过JPA的hibernate扩展来实现这一点?

共有1个答案

严欣怡
2023-03-14

在JPA中没有替代语法,Hibernate是JPA的超集,它提供了超出JPA规范的功能。在JPA中,您必须显式地使用选择语句(在您的情况下是多选择语句)单独进行预测。

条件查询

 // Create instance of CriteriaBuilder, where em is EntityManager
CriteriaBuilder cb = em.getCriteriaBuilder();      

  // Use CriteriaBuilder interface to create an instance 
  // of CriteriaQuery. For multiselect result set is Object [].
CriteriaQuery<Object[]> c = cb.createQuery(Object[].class);

   // Establish the root of the query by invoking from() to get back a Root object. 
Root<User> user = c.from(User.class); 

  // Establish the SELECT clause of the query by passing the root into the multiselect() method
criteriaQuery.multiselect(user.get("property1"), user.get("property2"));

另一种选择是构造函数调用:

CriteriaQuery<User> c = cb.createQuery(User.class);
Root<User> user = c.from(User.class);
c.select(cb.construct(User.class,
                      user.get("property1"),
                      user.get("property2")));

TupleQuery

    CriteriaQuery<Tuple> c = cb.createTupleQuery();
    Root<User> user = c.from(User.class);
    c.select(cb.tuple(user.get("property1"), user.get("property2")));
    Query query = entityManager.createQuery(c);
    List<Tuple> results = query.getResultList();

还有array()方法(它返回Object[])。

    c.select(cb.array(user.get("property1"), user.get("property2")));
 类似资料:
  • 泛型方法 在控制器中获取列表 测试 测试 结果[java.lang.ClassCastException] 为什么该类强制执行异常,因为criteria.SetProjection(pl)返回条件,然后返回相同列表的条件。 如何对此进行动态控制? 更新我!

  • 问题内容: 我一直想知道应该使用哪种类型的投影,所以我做了一点测试,涵盖了5种类型的投影(基于docs:https : //docs.spring.io/spring- data/jpa/docs/current / reference / html /#projections ): 1.实体投影 这只是Spring Data存储库提供的标准。这里没什么好看的。 服务: 实体: 2.构造函数投影

  • 我有一个关于嵌套列表投影界面用法的问题。我有两个实体(父和子)(它们有单向关联) 父级=> 子=> 我有两个选择特定列投影界面。 这个查询可以工作,但是它选择ChildEntity的所有列,并且只将id、name propeties映射到ChildProjection。(生成的查询选择所有列,但我想只选择id和name列) 我如何只选择id和name列(为嵌套列表投影界面选择特定列)并映射到Chi

  • 问题内容: 我对Hibernate的 预测 和 标准 感到困惑。何时使用投影以及何时使用标准? 问题答案: 它们不是互斥的,您可以同时使用两者。投影通常在某些条件下使用。 简而言之,使用Hibernate Projections来仅查询要使用Criteria查询的一个实体或一组实体的属性的子集。您还可以使用预测指定条款和聚合函数一样,等等。这就像指 其 数据你抓取。就像修改SQL查询中的子句一样。

  • 嗨,我想写一个查询使用条件:以下查询必须使用条件创建: “从S2中选择不同的(s2Taxper),其中s2Tc='601'和s2Txcd!=”” 提前谢谢