【问题标题】: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 具有相同的名称,即使它应该有自己的名称。我不知道这里有什么问题,我什至给它们起了别名来区分它们。

【问题讨论】:

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

标签: java mysql sql named-query


【解决方案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,-啊,我现在看到另一列了
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2020-10-21
  • 1970-01-01
相关资源
最近更新 更多