一个类中多个表的java选择性列Hibernate
我有两个类:用户和应用程序
用户有到应用程序的一对多映射。用户有很多字段,有些字段非常大,比如description。当我想用它来查看用户和应用程序之间的关系时,我不想加载用户的所有字段,所以我创建了一个代理类,该类包含用户名和应用程序集合。我怎样才能把这两张桌子安排到这门课上?或者最佳实践是什么
更新:
@Entity
public class UserProfile implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
private String userName;
private String password;
@OneToMany
@JoinTable(name = "userapplicationlink", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "appId"))
private Collection<Application> applications;
}
@Entity
public class Application
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int id;
private String name;
private String url;
}
main()
{
UserProfile user1 = new UserProfile();
user1.setUserName("sasd");
user1.setPassword("123");
Application app = new Application();
app.setName("User Application");
app.setPriority(1);
app.setUrl("/user.do");
app.setDescription("app");
user1.setApplications(new ArrayList());
user1.getApplications().add(app);
SessionFactory sessionFac = new Configuration().configure().buildSessionFactory();
Session session = sessionFac.openSession();
session.beginTransaction();
session.save(user1);
session.save(app);
session.getTransaction().commit();
System.out.println("End");
session.close();
sessionFac.close();
sessionFac = new Configuration().configure().buildSessionFactory();
session = sessionFac.openSession();
session.beginTransaction();
try
{
Query query = session.createQuery("SELECT NEW empire.erp.server.db.UserNameAndApplications(u.userName, u.applications) FROM UserProfile u JOIN FETCH u.applications");
List result = query.list();
session.getTransaction().commit();
session.close();
}
finally
{
session.close();
sessionFac.close();
}
}
堆栈跟踪
线程“main”组织中出现异常。冬眠QueryException:查询指定的联接获取,但是获取的关联的所有者不在选择列表中[FromElement{explicit,not a collection join,fetch join,fetch non lazy properties,classAlias=null,role=empire.erp.server.db.UserProfile.applications,tableName=Application,tableAlias=Application2_,origin=userprofil0_,columns={userprofil0_u.id,className=empire.erp.server.db.Application}][从empire.erp.server.db.UserProfile u JOIN FETCH u.applications中选择NEW empire.erp.server.db.userName和应用程序(u.userName,u.applications) 在org。冬眠查询例外。generateQueryException(QueryException.java:120) 在org。冬眠查询例外。wrapWithQueryString(QueryException.java:103) 在org。冬眠hql。内部的阿斯特。QueryTranslatorImpl。doCompile(QueryTranslatorImpl.java:218) 在org。冬眠hql。内部的阿斯特。QueryTranslatorImpl。编译(QueryTranslatorImpl.java:142) 在org。冬眠发动机查询spi。HQLQueryPlan。(HQLQueryPlan.java:115) 在org。冬眠发动机查询spi。HQLQueryPlan。(HQLQueryPlan.java:76) 在org。冬眠发动机查询spi。槲皮兰。getHQLQueryPlan(QueryPlanCache.java:150) 在org。冬眠内部的AbstractSessionImpl。getHQLQueryPlan(AbstractSessionImpl.java:302) 在org。冬眠内部的AbstractSessionImpl。createQuery(AbstractSessionImpl.java:240) 在org。冬眠内部的SessionImpl。createQuery(SessionImpl.java:1907) 在帝国。企业资源计划服务器db。用户档案。main(UserProfile.java:216) 原因:org。冬眠QueryException:查询指定的联接获取,但是获取的关联的所有者不在选择列表中[FromElement{explicit,not a collection join,fetch join,fetch non lazy properties,classAlias=null,role=empire.erp.server.db.UserProfile.applications,tableName=Application,tableAlias=Application2_,origin=userprofil0_,columns={userprofil0_uu1;id,className=empire.erp.server.db.Application}] 在org。冬眠hql。内部的阿斯特。树选择子句。initializeExplicitSelectClause(SelectClause.java:214) 在org。冬眠hql。内部的阿斯特。HqlSqlWalker。useSelectClause(HqlSqlWalker.java:991) 在org。冬眠hql。内部的阿斯特。HqlSqlWalker。processQuery(HqlSqlWalker.java:759) 在org。冬眠hql。内部的安特尔。HqlSqlBaseWalker。查询(HqlSqlBaseWalker.java:675) 在org。冬眠hql。内部的安特尔。HqlSqlBaseWalker。selectStatement(HqlSqlBaseWalker.java:311) 在org。冬眠hql。内部的安特尔。HqlSqlBaseWalker。语句(HqlSqlBaseWalker.java:259) 在org。冬眠hql。内部的阿斯特。QueryTranslatorImpl。分析(QueryTranslatorImpl.java:262) 在org。冬眠hql。内部的阿斯特。QueryTranslatorImpl。doCompile(QueryTranslatorImpl.java:190) ... 还有8个
更新2:运行查询而不获取
休眠:选择userprofil0。用户名为col_0_0_0;。作为UserProfile userprofil0中的col_1_0_uu,内部连接userapplicationlink application1_uu,位于userprofil0_u上。id=应用程序1。用户ID内部加入应用程序application2_uu1_u1。appId=application2_2;。用户profil0上的id内部连接用户应用程序链接应用程序3。id=application3_u2;。用户ID内部加入应用程序application3上的应用程序application4。appId=application4_u2;。身份证件 2016年5月7日下午4:17:21组织。冬眠发动机jdbc。spi。SqlExceptionHelper日志异常 警告:SQL错误:0,SQLState:42601 2016年5月7日下午4:17:21组织。冬眠发动机jdbc。spi。SqlExceptionHelper日志异常 错误:错误:语法错误在或接近 职位:43 2016年5月7日下午4:17:21组织。冬眠发动机jdbc。连接。内部的DriverManager连接ProviderImpl停止 信息:HHH10001008:清理连接池[jdbc:p]ostgresql://localhost:5432/optimalyou] 线程“main”组织中出现异常。冬眠例外SQLGrammarException:无法提取结果集 在org。冬眠例外内部的SqlStateConversionLegate。convert(SQLStateConversionDelegate.java:106) 在org。冬眠例外内部的标准SQLExceptionConverter。转换(StandardSQLExceptionConverter.java:42) 在org。冬眠发动机jdbc。spi。SqlExceptionHelper。转换(SqlExceptionHelper.java:111) 在org。冬眠发动机jdbc。spi。SqlExceptionHelper。转换(SqlExceptionHelper.java:97) 在org。冬眠发动机jdbc。内部的结果TretReturnImpl。摘录(ResultSetReturnImpl.java:79) 在org。冬眠加载器。加载器。getResultSet(Loader.java:2115) 在org。冬眠加载器。加载器。executeQueryStatement(Loader.java:1898) 在org。冬眠加载器。加载器。executeQueryStatement(Loader.java:1874) 在org。冬眠加载器。加载器。doQuery(Loader.java:919) 在org。冬眠加载器。加载器。doQueryAndInitializeNonLazyCollections(Loader.java:336) 在org。冬眠加载器。加载器。doList(Loader.java:2610) 在org。冬眠加载器。加载器。doList(Loader.java:2593) 在org。冬眠加载器。加载器。listIgnoreQueryCache(Loader.java:2422) 在org。冬眠加载器。加载器。列表(Loader.java:2417) 在org。冬眠加载器。hql。QueryLoader。列表(QueryLoader.java:501) 在org。冬眠hql。内部的阿斯特。QueryTranslatorImpl。列表(QueryTranslatorImpl.java:371) 在org。冬眠发动机查询spi。HQLQueryPlan。performList(HQLQueryPlan.java:216) 在org。冬眠内部的SessionImpl。列表(SessionImpl.java:1339) 在org。冬眠内部的QueryImpl。列表(QueryImpl.java:87) 在帝国。企业资源计划服务器db。用户档案。main(UserProfile.java:217) 原因:org。postgresql。util。PSQLException:错误:语法错误在“”处或附近 职位:43 在org。postgresql。果心v3。QueryExecutorImpl。receiveErrorResponse(QueryExecutorImpl.java:2284) 在org。postgresql。果心v3。QueryExecutorImpl。processResults(QueryExecutorImpl.java:2003) 在org。postgresql。果心v3。QueryExecutorImpl。执行(QueryExecutorImpl.java:200) 在org。postgresql。jdbc。声明。执行(PgStatement.java:424) 在org。postgresql。jdbc。准备好的声明。executeWithFlags(PgPreparedStatement.java:161) 在org。postgresql。jdbc。准备好的声明。executeQuery(PgPreparedStatement.java:114) 在org。冬眠发动机jdbc。内部的结果TretReturnImpl。摘录(ResultSetReturnImpl.java:70) ... 还有15个
# 1 楼答案
必须为收藏使用别名。不知道为什么。正确的HQL是