JPA 实体 class 中用于定义列的数据类型是否会影响在 DAO 中创建查询?
Does the data type used in JPA entity class for defining a column impact the creation of a query in DAO?
在 java 实体 class 中,我为列定义了命名查询和数据类型。我在 DAO class 中执行查询但得到错误:java.lang.IllegalArgumentException: Type specified for TypedQuery [TestEntity] is incompatible with query return type [class java.util.Date]
。我没有使用 java.util.Date class 来定义 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 中 class
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;
查询 return 类型需要与您要在其中转换它的实体对象兼容。更新您的代码
TypedQuery<Date>date= entityManager.createNamedQuery("findByTestId", Date.class);
和return这个方法的类型应该像List<Date>
。
这对你有帮助。
基于您的代码。您应该将查询更改为此
@NamedQuery(name = "findByTestId", query = "select u from TestEntity u where u.my_id = :testId")
如果您只想获取日期,则必须编辑您的方法。
您的查询应该return java.util.Timestamp 对象的列表,因为您在 select 列表中仅包含“mydate”字段,但在创建类型化查询时在 findByTestId 方法中,您指示 JPA return 一个 TestEntity 对象列表。解决此问题的最简单方法是像这样更改您的查询:
"select u from TestEntity u where u.my_id = :testId"
另外,java.sql.Timestamp是java.util.Date的子类,这或许可以解释为什么错误指的是java.util.Date。
在 java 实体 class 中,我为列定义了命名查询和数据类型。我在 DAO class 中执行查询但得到错误:java.lang.IllegalArgumentException: Type specified for TypedQuery [TestEntity] is incompatible with query return type [class java.util.Date]
。我没有使用 java.util.Date class 来定义 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 中 class
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;
查询 return 类型需要与您要在其中转换它的实体对象兼容。更新您的代码
TypedQuery<Date>date= entityManager.createNamedQuery("findByTestId", Date.class);
和return这个方法的类型应该像List<Date>
。
这对你有帮助。
基于您的代码。您应该将查询更改为此
@NamedQuery(name = "findByTestId", query = "select u from TestEntity u where u.my_id = :testId")
如果您只想获取日期,则必须编辑您的方法。
您的查询应该return java.util.Timestamp 对象的列表,因为您在 select 列表中仅包含“mydate”字段,但在创建类型化查询时在 findByTestId 方法中,您指示 JPA return 一个 TestEntity 对象列表。解决此问题的最简单方法是像这样更改您的查询:
"select u from TestEntity u where u.my_id = :testId"
另外,java.sql.Timestamp是java.util.Date的子类,这或许可以解释为什么错误指的是java.util.Date。