具有相同列名的命名查询内部连接表的重复数据/值

Posted

技术标签:

【中文标题】具有相同列名的命名查询内部连接表的重复数据/值【英文标题】:Duplicate data/value for Named Query Inner join tables with same column name 【发布时间】:2018-05-27 04:25:15 【问题描述】:

我正在尝试使用下面的命名查询加入三个表:Student、BorrowedBook、Books

List< Student > stuList= new ArrayList< Student >( );
StringBuilder sb = new StringBuilder( );
sb.append( "select s.studentId, s.name, s.lastName, b.name " );
sb.append( "from student s " );
sb.append( "inner join borrowedbook c on 
            s.studentId = c.studentId " );
sb.append( "inner join books b on c.bookId = b.bookId " );

Query query = getSession( ).createSQLQuery( sb.toString( ) );
query.setProperties( Student.class );

List< Object[] > searchResults = query.list( );

但是,当我在调试模式下的 searchResults 中检查 b.name 的值时,它会得到 s.name 的值。意思是,b.name 与 s.name 具有相同的名称,即使它应该有自己的名称。我不知道这里有什么问题,我什至给它们起了别名来区分它们。

【问题讨论】:

您提到您在此处尝试使用别名,但我在任何地方都没有看到这种尝试。无论如何,事实上这是解决您问题的一种方法。 【参考方案1】:

您应该将两个 name 列别名为不同的东西:

StringBuilder sb = new StringBuilder( );
sb.append( "select s.studentId, s.name as student_name, s.lastName, " );
sb.append( " b.name as book_name " );
sb.append( "from student s " );
sb.append( "inner join borrowedbook c on s.studentId = c.studentId " );
sb.append( "inner join books b on c.bookId = b.bookId " );

然后使用列名student_namebook_name 访问您的结果集。

【讨论】:

我收到一个错误。对于整个堆栈来说太长了 原因:com.ibm.db2.jcc.am.SqlException: [jcc][10150][10300][4.14.137] 无效参数:未知的列名 NAME。 ERRORCODE=-4460, SQLSTATE=null at com.ibm.db2.jcc.am.ed.a(ed.java:661) at com.ibm.db2.jcc.am.ed.a(ed.java:60)在 com.ibm.db2.jcc.am.ed.a(ed.java:103) 在 com.ibm.db2.jcc.am.fb.a(fb.java:2122) 在 com.ibm.db2.jcc .am.ResultSet.findColumnX(ResultSet.java:1932) 在 com.ibm.db2.jcc.am.ResultSet.getString(ResultSet.java:1704) 在 com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.getString(WSJdbcResultSet .java:2467) 00000044 SystemErr R org.hibernate.exception.GenericJDBCException: 无法在 org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126) 在 org.hibernate.exception.SQLStateConverter.convert 执行查询(SQLStateConverter.java:114) 在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 我不认为这个错误只是由我建议的更改引起的,假设您实际上将它作为原始查询运行。我认为问题出在代码的其他地方。 @Strawberry 没有错误的逗号 AFAIK。你在哪里看到的? @timbiegeleisen s.lastname,-啊,我现在看到另一列了

以上是关于具有相同列名的命名查询内部连接表的重复数据/值的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 Oracle 用户查询列名 [重复]

从列名确定表名[重复]

重命名具有任意顺序和重复列名的多索引列

oracle 创建视图 提示列名重复,我知道应该是重名的列,重命名一下 怎么命名啊?

3个表的内部连接给出重复的结果

union连接的两个表的字段必须完全相同吗?