JPA实体类中用于定义列的数据类型是否会影响DAO中查询的创建?

问题描述

在java实体类中,我为列定义了命名查询和数据类型。我在DAO类中执行了查询,但收到错误java.lang.IllegalArgumentException: Type specified for TypedQuery [TestEntity] is incompatible with query return type [class java.util.Date]。我没有使用java.util.Date类来定义mydate列,而是使用了java.sql.Timestamp,因此尚不清楚为什么该错误指向java.util.Date。看来我做错了什么,但不清楚是什么。

@Entity
@Table(name = "SAMPLE",schema = "MYSCHEMA")
@NamedQuery(name = "findByTestId",query = "select u.mydate from TestEntity u where u.my_id = :testId")

public class TestEntity {


    @Id
    @Column(name = "MY_ID")
    private String my_id;

    @Column(name = "mydate")
    private java.sql.Timestamp mydate;

在DAO类中

public classtest Dao extends BaseDao

  public List<TestEntity> findByTestId(String id) {
            return execute("punit",entityManager -> {
                TypedQuery<TestEntity> query = entityManager.createNamedQuery("findByTestId",TestEntity.class);
                query.setParameter("testId",id);
                return query.getResultList();
            });
        }

解决方法

请尝试使用以下代码,它可以工作。

   @Column(name = "mydate")
    private Date mydate;

查询返回类型必须与您要在其中强制转换的实体对象兼容。更新您的代码

TypedQuery<Date>date= entityManager.createNamedQuery("findByTestId",Date.class);

此方法的返回类型应类似于 List<Date> 。 这将为您提供帮助。

,

根据您的代码。您应该将查询更改为此

@NamedQuery(name = "findByTestId",query = "select u from TestEntity u where u.my_id = :testId")

如果只想获取日期,则必须编辑方法。

,

您的查询应该返回java.util.Timestamp对象的列表,因为您在选择列表中仅包含“ mydate”字段,但是在findByTestId方法中创建类型化查询时,您正在指示JPA返回一个TestEntity对象的列表。解决此问题的最简单方法是像这样更改您的查询:

"select u from TestEntity u where u.my_id = :testId"

此外,java.sql.Timestamp是java.util.Date的子类,它可以解释为什么错误引用java.util.Date。