简体   繁体   English

一类中多个表的选择性列-Hibernate

[英]selective columns from multiple tables in one class - Hibernate

I have two classes User and Application. 我有两个类的用户和应用程序。

User has one to many mapping to application. 用户具有一对多到应用程序的映射。 User has a lot of fields, some are pretty big ones like description. 用户有很多字段,有些是很大的字段,例如description。 I don't want to load all the fields of the user when I want to use it to see the relationship between user and application so I created a proxy class that has username and a collection of application. 当我想使用它查看用户与应用程序之间的关系时,我不想加载用户的所有字段,因此我创建了一个具有用户名和应用程序集合的代理类。 How do I the two tables to this class? 我如何将这两个表放到此类中? Or what is the best practice? 或最佳做法是什么?

update : 更新:

@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();
    }
}

Stack trace 堆栈跟踪

Exception in thread "main" org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=empire.erp.server.db.UserProfile.applications,tableName=Application,tableAlias=applicatio2_,origin=UserProfile userprofil0_,columns={userprofil0_.id ,className=empire.erp.server.db.Application}}] [SELECT NEW empire.erp.server.db.UserNameAndApplications(u.userName, u.applications) FROM empire.erp.server.db.UserProfile u JOIN FETCH u.applications] at org.hibernate.QueryException.generateQueryException(QueryException.java:120) at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142) at org.hibernate.engine.query.spi.HQLQueryP 线程“主”中的异常org.hibernate.QueryException:查询指定了联接获取,但是选择列表中不存在所获取的关联的所有者[FromElement {explicit,不是集合联接,获取联接,获取非惰性属性, classAlias = null,role = empire.erp.server.db.UserProfile.applications,tableName = Application,tableAlias = applicatio2_,origin = UserProfile userprofil0_,columns = {userprofil0_.id,className = empire.erp.server.db.Application} }]从orgire.erp.server.db.UserProfile中选择新的empire.erp.server.db.UserNameAndApplications(u.userName,u.applications)加入联接u.applications],位于org.hibernate.QueryException.generateQueryException(QueryException org.hibernate.QueryException.wrapWithQueryString(.QueryException.java:103)处的org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218)处的org.hibernate.hql.internal处的.java:120)。 org.hibernate.engine.query.spi.HQLQueryP的ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142) lan.(HQLQueryPlan.java:115) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:76) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150) at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302) at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240) at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1907) at empire.erp.server.db.UserProfile.main(UserProfile.java:216) Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=empire.erp.server.db.UserProfile.applications,tableName=Application,tableAlias=applicatio2_,origin=UserProfile userprofil0_,columns={userprofil0_.id ,className=empire.erp.server.db.Application}}] at org.hibernate.hql.internal.ast.tree.SelectClaus 局域网(HQLQueryPlan.java:115)在org.hibernate.engine.query.spi.HQLQueryPlan。(HQLQueryPlan.java:76)在org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)在org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)在org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)在org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1907) ),位于empire.erp.server.db.UserProfile.main(UserProfile.java:216),原因是:org.hibernate.QueryException:查询指定了联接提取,但是选择列表[FromElement中不存在所提取的关联的所有者。 {明确,不是集合联接,获取联接,获取非惰性属性,classAlias =空,role = empire.erp.server.db.UserProfile.applications,tableName = Application,tableAlias = applicatio2_,origin = UserProfile用户配置文件0_,列= {userprofil0_.id,className = empire.erp.server.db.Application}}],位于org.hibernate.hql.internal.ast.tree.SelectClaus e.initializeExplicitSelectClause(SelectClause.java:214) at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:991) at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:759) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:675) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:311) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:259) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190) ... 8 more org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:991)的e.initializeExplicitSelectClause(SelectClause.java:214)在org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSql。 759),位于org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:675),位于org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:311),位于org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:675) org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262)的.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:259)在org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile (QueryTranslatorImpl.java:190)...还有8个

Update 2: running query without fetch 更新2:在不获取的情况下运行查询

Hibernate: select userprofil0_.userName as col_0_0_, . 休眠:选择userprofil0_.userName作为col_0_0_。 as col_1_0_ from UserProfile userprofil0_ inner join userapplicationlink applicatio1_ on userprofil0_.id=applicatio1_.userId inner join Application applicatio2_ on applicatio1_.appId=applicatio2_.id inner join userapplicationlink applicatio3_ on userprofil0_.id=applicatio3_.userId inner join Application applicatio4_ on applicatio3_.appId=applicatio4_.id May 07, 2016 4:17:21 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 0, SQLState: 42601 May 07, 2016 4:17:21 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: ERROR: syntax error at or near "." 作为来自UserProfile的col_1_0_ userprofil0_内部连接userprofil0_.id = applicatio1_.userId上的userapplicationlink applicatio1_内部连接应用程序applicatio1_.appId = applicatio2_.id上的内部应用程序applicatio2_ on userprofil0_.id =内部应用程序applicatio3_.userId applicatio4_.id 2016年5月7日4:17:21 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions警告:SQL错误:0,SQLState:42601 2016年5月7日4:17:21 PM org.hibernate.engine .jdbc.spi.SqlExceptionHelper logExceptions错误:错误:“”或附近的语法错误。 Position: 43 May 07, 2016 4:17:21 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH10001008: Cleaning up connection pool [jdbc:postgresql://localhost:5432/optimalyou] Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79) at org.hibernate.loader.Loader.getResultSet(Loader.java:2115) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898) at org.hibernate.loader.Loader.executeQueryStatement(Loa 位置:43 2016年5月7日下午4:17:21 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop信息:HHH10001008:清理连接池[jdbc:postgresql:// localhost:5432 / optimalyou]中的异常线程“主要” org.hibernate.exception.SQLGrammarException:无法在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)处提取ResultSet。 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.42)在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)处(org.hibernate) .engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)在org.hibernate.loader.Loader.getResultSet(Loader.java:2115)在org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898) )在org.hibernate.loader.Loader.executeQueryStatement(Loa der.java:1874) at org.hibernate.loader.Loader.doQuery(Loader.java:919) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) at org.hibernate.loader.Loader.doList(Loader.java:2610) at org.hibernate.loader.Loader.doList(Loader.java:2593) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422) at org.hibernate.loader.Loader.list(Loader.java:2417) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1339) at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) at empire.erp.server.db.UserProfile.main(UserProfile.java:217) Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "." der.java:1874)位于org.hibernate.loader.Loader.doQuery(Loader.java:919)位于org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)位于org.hibernate.loader.Loader.doList (Loader.java:2610)在org.hibernate.loader.Loader.doList(Loader.java:2593)在org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422)在org.hibernate.loader.Loader。 org.hibernate.loader.hql.QueryLoader.list(Queryerer.java:501)的org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)的list(Loader.java:2417) org.hibernate.internal.SessionImpl.list(SessionImpl.java:1339)上的.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)在org.hibernate.internal.QueryImpl.list(QueryImpl.java) :87)at empire.erp.server.db.UserProfile.main(UserProfile.java:217)原因:org.postgresql.util.PSQLException:错误:“或附近”的语法错误。 Position: 43 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2284) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2003) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:200) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424) at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:161) at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) ... 15 more 位置:43在org.postgresql.core.v3上的org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2003)上的org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2284)上。 org.postgresql.org上的QueryExecutorImpl.execute(QueryExecutorImpl.java:200)org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424)org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:161)在org.postgresql .org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)的.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)...另外15个

Had to use an alias for the collection. 必须为集合使用别名。 Not sure why though. 不知道为什么。 The proper HQL is 适当的HQL是

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM