Java JPA实体类中用于定义列的数据类型是否影响DAO中查询的创建?
在java实体类中,我为列定义了命名查询和数据类型。我在DAO类中执行了查询,但出现错误:Java JPA实体类中用于定义列的数据类型是否影响DAO中查询的创建?,java,jpa,jpql,Java,Jpa,Jpql,在java实体类中,我为列定义了命名查询和数据类型。我在DAO类中执行了查询,但出现错误:java.lang.IllegalArgumentException:为TypedQuery[TestEntity]指定的类型与查询返回类型[class java.util.Date]不兼容。。我没有使用java.util.Date类来定义mydate列,而是使用了java.sql.Timestamp,因此不清楚错误为什么指向java.util.Date。看起来我做错了什么,但不清楚是什么 @Entity
java.lang.IllegalArgumentException:为TypedQuery[TestEntity]指定的类型与查询返回类型[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;
道课
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();
});
}
公共类测试Dao扩展了BaseDao
公共列表findByTestId(字符串id){
返回执行(“punit”,entityManager->{
TypedQuery query=entityManager.createNamedQuery(“findByTestId”,TestEntity.class);
query.setParameter(“testId”,id);
返回query.getResultList();
});
}
请您尝试下面的代码,它会工作的
@Column(name = "mydate")
private Date mydate;
查询返回类型需要与要在其中强制转换它的实体对象兼容。更新你的代码
TypedQuery<Date>date= entityManager.createNamedQuery("findByTestId", Date.class);
TypedQuerydate=entityManager.createNamedQuery(“findByTestId”,Date.class);
此方法的返回类型应类似于列表
。
这将对您有所帮助。请您尝试下面的代码,它将起作用
@Column(name = "mydate")
private Date mydate;
查询返回类型需要与要在其中强制转换它的实体对象兼容。更新你的代码
TypedQuery<Date>date= entityManager.createNamedQuery("findByTestId", Date.class);
TypedQuerydate=entityManager.createNamedQuery(“findByTestId”,Date.class);
此方法的返回类型应类似于列表
。
这将帮助您。基于您的代码。您应该将查询更改为
@NamedQuery(name = "findByTestId", query = "select u from TestEntity u where u.my_id = :testId")
如果只想获取日期,则必须根据代码编辑方法。。您应该将查询更改为
@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的原因。您的查询应该返回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的原因。命名查询的用法很奇怪。您只选择日期字段,但在DAO的代码段中,您将返回TestEntity。ORM现在不知道如何将列mydate映射到类型TestEntity。引发强制转换异常的原因可能是java.sql.Timestamp enherits from java.util.date您对命名查询的使用很奇怪。您只选择日期字段,但在DAO的代码段中,您将返回TestEntity。ORM现在不知道如何将列mydate映射到类型TestEntity。可能是由于java.util.date中的java.sql.Timestamp enherits导致了强制转换异常,这将如何解决该问题?在命名查询中选择java.sql.Timestamp时,ORM映射程序被要求返回TestEntity。@GerbenJongerius
查询返回类型需要与要在其中强制转换它的实体对象兼容。
我已更新了答案。这将如何解决问题?在命名查询中选择java.sql.Timestamp时,ORM映射程序被要求返回TestEntity。@GerbenJongerius查询返回类型需要与要在其中强制转换它的实体对象兼容。
我已更新了答案。