我有一个对象admin
,它扩展了user
。默认情况下,这两个对象都在我的Derby数据库的表user_
中(包含admin
中的字段)。通常我会选择用户
,如下所示:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root user= query.from(User.class);
Predicate predicateId = cb.equal(category.get("id"), id);
query.select(user).where(predicateId);
return em.createQuery(query).getSingleResult();
但是,由于查询的复杂性,我使用的是本机查询,如下所示:
Query query = em.createNativeQuery("SELECT USER.* FROM USER_ AS USER WHERE ID = ?");
query.setParameter(1, id);
return (User) query.getSingleResult();
但这会引发一个强制转换异常。我认为这是由于admin
中的任何字段。
我的问题是,如何使用具有相等结果的本机查询作为第一个示例(包括与JPQL查询返回的@lob
和@ManyToOne
(等等)相同的值)来选择用户
?
您可能希望尝试以下方法之一:
>
CreateNativeQuery(sqlString,resultClass)
方法,也可以使用EntityManager.CreateNativeQuery()
API动态定义本机查询。
String sql = "SELECT USER.* FROM USER_ AS USER WHERE ID = ?";
Query query = em.createNativeQuery(sql, User.class);
query.setParameter(1, id);
User user = (User) query.getSingleResult();
本机查询是通过@namednativequery
和@namednativequery
注释或
XML元素定义的。
@NamedNativeQuery(
name="complexQuery",
query="SELECT USER.* FROM USER_ AS USER WHERE ID = ?",
resultClass=User.class
)
public class User { ... }
Query query = em.createNamedQuery("complexQuery", User.class);
query.setParameter(1, id);
User user = (User) query.getSingleResult();
您可以在优秀的开放书籍Java Persistence(PDF版本)中阅读更多内容。
注意:关于GetSingleResult()
的使用,请参阅为什么在JPA中从不使用GetSingleResult()
。
问题内容: 我有一个延伸的对象。默认情况下,两个对象都在我的Derby数据库的表中(来自的包含字段)。通常我会选择一个这样的: 但是由于查询的复杂性,我使用的是本机查询,如下所示: 尽管这会引发强制转换异常。我认为这是由于中的任何字段造成的。 我的问题是,我如何选择一个使用本机查询的结果与第一个示例相同的结果(包括与JPQL查询将返回的和(等)相同的值)? 问题答案: 您可能想尝试以下方法之一:
当使用jpa本机查询 事务传播是我们正在使用的正确jpa的唯一特性吗? 在我的意见中,我就像使用普通的旧jdbc pluc jpa事务传播 我正在阅读PRO JPA一书,根据我的理解 当我们使用JPA本机查询获取一组标量值时(与我们使用jdbc的方式很相似),实际上没有托管实体和持久性上下文的概念。当我们通过本机查询检索实体时,情况会发生变化。
问题内容: 我正在使用JPQL本机查询来联接表,查询结果存储在中。 问题是 输出: 输出: 所以我假设我可以分配out.get(0)的返回值,该值应该是String: 但是我得到了奇怪的ClassCastException。 那么到底是怎么回事?甚至会抛出ClassCastException :( 问题答案: 我对JPQL本机查询不熟悉,但是您只需使用以下命令进行调试: 对象o = out.get
问题内容: JPA()中的本机查询是否支持缓存? 我正在填写自己的数据传输对象,因为sql查询会联接多个表,并且仅从表中获取几个列。 问候 问题答案: 这是可能的,但 您必须使用显式或。 也可以看看 缓存SQL查询问题 hibernate:真正了解二级和查询缓存
我有一个用hibernate持久化的带有DateTime属性的实体 对于常规的spring-data-jpa生成的查询来说,这一切都很好。 我正在尝试添加自定义本机查询 我得到的错误是当试图调用这个是 这与我在将自定义类型映射添加到实体之前使用常规spring-data Finder时得到的错误相同 如何使spring-data-jpa/hibernate使用参数到本机查询的自定义类型映射?
奇怪的情况-下面是代码: 构建项目时(在项目属性中使用编译器选项Xlint:unchecked),我得到一个警告: 警告:[未选中]未选中的强制转换 ArrayList list=(ArrayList)obj[1]; 必需:ArrayList 找到:对象 但用同样的方法来浇铸字符串是可以的。这里有什么问题?