我在我的项目中使用JPA.
我来到一个查询,我需要在五个表上进行连接操作.所以我创建了一个返回五个字段的本机查询.
现在我想将结果对象转换为包含相同五个字符串的java POJO类.
在JPA中是否有任何方法可以直接将该结果转换为POJO对象列表?
我来到以下解决方案..
@NamedNativeQueries({
@NamedNativeQuery(
name = "nativeSQL",
query = "SELECT * FROM Actors",
resultClass = db.Actor.class),
@NamedNativeQuery(
name = "nativeSQL2",
query = "SELECT COUNT(*) FROM Actors",
resultClass = XXXXX) // <--------------- problem
})
Run Code Online (Sandbox Code Playgroud)
现在在resultClass中,我们是否需要提供一个实际的JPA实体类?或者我们可以将它转换为包含相同列名的任何JAVA POJO类吗?
我有一个Admin扩展的对象User.默认情况下,两个对象都在User_我的Derby数据库的表中(包含的字段Admin).通常我会选择User这样的:
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();
Run Code Online (Sandbox Code Playgroud)
但是由于我的查询的复杂性,我正在使用这样的本机查询:
Query query = em.createNativeQuery("SELECT USER.* FROM USER_ AS USER WHERE ID = ?");
query.setParameter(1, id);
return (User) query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
虽然这会抛出一个强制转换异常.我认为这是由于任何领域Admin.
我的问题是,如何选择User使用具有相同结果的本机查询作为第一个示例(包括与JPQL查询将返回的@LOB和@ManyToOne(等等)相同的值)?
我是新手,试图谷歌,但我无法解决我的问题.请帮忙.
我试图在我的POJO类PersonC中映射两个实体:PersonA和Person
@Entity
class PersonA{
String sample_field;
}
@Entity
class Person{
String id;
String name;
}
Run Code Online (Sandbox Code Playgroud)
以上两个是jpa的实体.
现在我想将它们合并到一个pojo类中.
class PersonC
{
Strind id;
String address;
}
Run Code Online (Sandbox Code Playgroud)
尝试下面的代码,但当我尝试获取地址/外键字段时,它不起作用.
@SqlResultSetMapping(name="PersonC",
classes = {
@ConstructorResult(targetClass = PersonC.class,
columns = {@ColumnResult(name="name")
, @ColumnResult(name="address")
)}
Run Code Online (Sandbox Code Playgroud)
我应该在哪里定义@SqlResultSetMapping,从上面的哪个类?)})
我正在使用Spring+ Hibernate并且我有一个特殊情况,我需要获取(一个列表)非Entity对象作为查询的结果.
我决定使用@ConstructorResultin @SqlResultSetMapping并参考此映射@NamedNativeQuery,如此处和此处所述.
然而,在使用命名原生查询所有案例中,他们获得EntityManager通过实例@PersistenceContext并调用createNativeQuery就可以了,提供name的@NamedNativeQuery作为参数传递给该呼叫,如在此回答.
如何将存储库中声明的方法映射interface到特定的@NamedNativeQuery?我的尝试是使用EntityName.MethodNameInRepository或MethodNameInRepository作为name的@NamedNativeQuery,但没有运气.
这是我的简化代码:
@Entity(name = "AdDailyData")
@SqlResultSetMapping(
name="RevenueByAppAndDayMapping",
classes=@ConstructorResult(
targetClass=RevenueByAppAndDay.class,
columns={@ColumnResult(name="country_code"),
@ColumnResult(name="revenue", type=Double.class),
@ColumnResult(name="currency")}))
@NamedNativeQuery(
name="AdDailyData.aggregateRevenue",
query="SELECT country_code, sum(earnings) as revenue, currency "
+ "FROM ad_daily_data, pseudo_app, app "
+ "WHERE ad_daily_data.pseudo_app_id=pseudo_app.id AND pseudo_app.app_id=app.id AND app.id=:appId and ad_daily_data.day …Run Code Online (Sandbox Code Playgroud) 我正在将ETL过程从工具转换为Java批处理API应用程序.在这个ETL过程中.在当前版本(使用该工具)中,我们有许多连接不同表的SQL语句,以便生成所需的输出.现在可以转换为Java,JPA.
我想使用本机查询.这样会很好,因为它不需要为查询中使用的每个表创建实体,我可以使用POJO来查询结果(我也不需要重写查询).阅读这个答案,我知道我可以使用@SqlResultSetMapping.问题是我的项目中没有任何实体,所以我不知道在哪里放这个注释.我可以在任何地方放置这个注释,以便实体经理找到它吗?
PS:在我的概念证明中,我目前正手动从一组对象转换为POJO,但我真的不喜欢这种方法.
将@Entity注释添加到POJO将导致我的应用程序无法启动:
引起:org.hibernate.HibernateException:缺少表:MyTable
我不确定(现在正在搜索它),但我认为它可能是由我的persistence.xml中的这个属性引起的
<property name="hibernate.hbm2ddl.auto" value="validate"/>
Run Code Online (Sandbox Code Playgroud)