有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

一个类中多个表的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) 个答案

  1. # 1 楼答案

    必须为收藏使用别名。不知道为什么。正确的HQL是

     SELECT NEW empire.erp.server.db.UserNameAndApplications(u.userName, app) FROM UserProfile u JOIN u.applications app