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

JPA:使用criteriabuilder查找实体:属性名称与注释不同?

湛光华
2023-03-14

我有一个包含员工信息的mysql数据库,每个员工都有一个技术id作为主键。在MySQL中选择行匹配条件,我可以使用以下语句(工作)

SELECT * FROM database_test.employee WHERE fist_name='First1';

在Java我也可以使用这个作为一个本地语句来得到我想要的(作品):

        List<EmployeeEntity2> objects = m_em.createNativeQuery(
            "SELECT * database_test.employee WHERE first_name='First1'",
            EmployeeEntity2.class).getResultList();

然而,我想使用Criteriabuilder获得相同的结果,然后将其推广到多个columnName=columnEntry选择中。

public List<EmployeeEntity2> testNoParameter() {

    //Based on https://www.objectdb.com/java/jpa/query/criteria

    CriteriaBuilder cb = m_em.getCriteriaBuilder();

    CriteriaQuery<EmployeeEntity2> q = cb.createQuery(EmployeeEntity2.class);
    Root<EmployeeEntity2> c = q.from(EmployeeEntity2.class);
    ParameterExpression<String> p = cb.parameter(String.class);
    //Works
    //q.select(c).where(cb.equal(c.get("firstName"), p));
    //Won't work
    q.select(c).where(cb.equal(c.get("first_name"), p));        
    TypedQuery<EmployeeEntity2> query = m_em.createQuery(q);

    query.setParameter(p, "First1");
    List<EmployeeEntity2> results = query.getResultList();
    return results;
}

使用“fist_name”——来自实体的列名注释——将生成以下java。lang.IllegalArgumentException与:

    Unable to locate Attribute  with the the given name [first_name] on this ManagedType [xx.xxx.database.EmployeeEntity2]

EmployeeEntity2有“fist_name”注释:

@Column(name = "first_name", nullable = false)
@Override
public String getFirstName() {
    return super.getFirstName();
}

所以“first_name”应该存在,但是(经过一些调试)我发现,出于某种原因,期望的属性是“firstName”,我没有定义/注释它,那么它来自哪里?我如何使用数据库中实际定义的列名(column=“first_name”)?

共有1个答案

祁修诚
2023-03-14

您应该使用实体的属性名(而不是列名)来在条件生成器中使用它,而不是

 q.select(c).where(cb.equal(c.get("first_name"), p));  

使用

 q.select(c).where(cb.equal(c.get("firstName"), p));  

CriteriaBuilder与RDBMS模式无关,因此您使用的是模型(实体),而不是模式(表名等)。

在JPA中,您通常不使用SQL,而是使用JPQL。与JPQL中的SQL相当的是

“从EmployeEntity2 e中选择e,其中e.firstName='First1'

CriteriaQuery树和JPQL字符串稍后都转换为相同的查询树(不记得名称),因此它们都必须遵守相同的规则。

 类似资料:
  • 我有一个包含元素列表的实体,现在我想搜索这些元素的属性。这个约束应该是“与”连接的。请看这些简单的例子: 现在我想找到某个城市的家长,比如说“BigCity”,孩子们在学校“AwesomeSchool”,他们在六年级一班。我只想通过CriteriaBuilder获得搜索结果。 到目前为止,我得到了: 不幸的是,这里有两个问题:-看起来我无法在列表属性上调用-这将返回所有孩子在“AwesomeSch

  • 在我的示例中,如何使用JPA CriteriaBuilder(如hibernate Criteria)这样的标准进行选择? 和

  • 我目前的项目是用JavaFX完成的。我使用属性将(双向)视图字段绑定到bean(使用JFXtras的BeanPathAdapter)。 我选择用JPA和ObjectDB作为模型。 这是我第一次在独立的项目中使用JPA,这里我面临的是托管实体的问题。 实际上,我将托管实体绑定到视图字段,当视图字段的值更改时,实体会更新...和数据库也是如此。 我正在尝试找到一种手动保存/合并实体的方法,以便我可以询

  • 主要内容:JPA实体查找示例要找到一个实体,接口提供了方法,该方法根据主键搜索一个元素。 JPA实体查找示例 在这里,我们将搜索指定的记录并在控制台输出它的值。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码

  • 我已经通过应用程序配置了我的兔子属性。yaml和spring配置属性。因此,在配置交换、队列和绑定时,可以使用属性的getter 然而,当我配置@RabbitListener从队列登录消息时,我必须使用完整的属性名称,如 我希望避免这种容易出错的硬编码字符串,并参考configurationProperties bean,如: 我曾经遇到过一个与@EventListener类似的问题,在这里使用b

  • 问题内容: 我知道如果知道注释类,就可以轻松获取特定注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类不了解。我只想使用反射在运行时获取所有注释类名称及其属性,以将类信息转储为例如JSON文件的目的。我该如何轻松地做到这一点。 此方法将仅返回注释接口的动态代理。 问题答案: 与预期的相反,注释的元素不是属性-它们实际上是返回提供的值或默