【问题标题】:Hibernate Criteria Query select where clauseHibernate Criteria Query select where 子句
【发布时间】:2014-10-03 16:38:24
【问题描述】:
person:

id | owner_email               | firstname | lastname 
----+-------------+-----------+----------
 44 | john@gmail.com           | john       | wood
 45 | alex@gamil.com           | alex       | greenwood
 49 | peter@gamil.com          | peter      | blacksmith
 50 | john@gmail.com           | lee        | wu
 51 | john@gmail.com           | jane       | li

我正在制作一个 Spring Hibernate Web 应用程序, 我有一张像上面这样的桌子。 我想要得到的是这样的:

select * from person where owner_email='john@gmail.com'

所以该方法将返回与 john@gmail.com 相关的人员对象列表

这是我的查询代码,但不起作用...

    @PersistenceContext
    EntityManager em;


    @Transactional
    public List<Person> listPerson() {
        CriteriaQuery<Person> c = em.getCriteriaBuilder().createQuery(Person.class);
        Root<Person> from = c.from(Person.class);
        c.multiselect(from.get("owner_email"));
        c.orderBy(em.getCriteriaBuilder().asc(from.get("firstname")));
        return em.createQuery(c).getResultList();
    }

这是我得到的错误......

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [com.example.model.Person] [select new com.example.model.Person(generatedAlias0.owner_email) from com.example.model.Person as generatedAlias0]

请帮我提供代码示例,谢谢...

【问题讨论】:

  • 你的问题很不清楚。如果你想要一个人员列表,为什么你的方法返回一个 List 而不是一个 List?如果你想从person表中选择,为什么你使用c.from(PrayTimes.class)而不是c.from(Person.clas)?如果要在 owner_email 上添加谓词,为什么不添加呢?该代码与您的描述完全不匹配。最后,你到底为什么要使用标准而不是简单的 JPQL 查询:select p from Person p where p.ownerEmail = :email
  • 现在你更改了代码,但错误与代码不匹配。
  • 复制了错误的代码,,,编辑一下就行了
  • 那么我到底把sql查询放在哪里?
  • 此外,您在这里所拥有的都不是 Hibernate 特定的;你正在使用所有 JPA 的东西。

标签: java sql hibernate spring-mvc criteriaquery


【解决方案1】:
@PersistenceContext 
EntityManager em;

@Transactional 
public List<Person> listPerson() { 
    CriteriaQuery<Person> c = em.getCriteriaBuilder().createQuery(Person.class); 
    Root<Person> from = c.from(Person.class); 

    c.select(from);
    c.where(em.getCriteriaBuilder().equal(from.get("owner_email"),"john@gmail.com")); // <- this will add the restriction. 

    c.orderBy(em.getCriteriaBuilder().asc(from.get("firstname"))); 
    return em.createQuery(c).getResultList(); 
}

【讨论】:

  • 我已编辑您的答案以格式化您的代码。如果您更新它以引起对您已更改代码的重要部分的注意,这个答案可能会更好。
  • @JasonC 谢谢!我正在为 Android 应用程序中的 wiki 语法而苦苦挣扎。
  • 建议:我会设置一个builder 变量,而不是多次调用em.getCriteriaBuilder()
猜你喜欢
  • 2017-01-20
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 2011-05-11
相关资源
最近更新 更多