Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有相同列名的命名查询内部联接表的重复数据/值_Java_Mysql_Sql_Named Query - Fatal编程技术网

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

Java 具有相同列名的命名查询内部联接表的重复数据/值,java,mysql,sql,named-query,Java,Mysql,Sql,Named Query,我试图使用下面的命名查询联接三个表: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 " );

我试图使用下面的命名查询联接三个表: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( );
ListstuList=newarraylist();
StringBuilder sb=新的StringBuilder();
sb.追加(“选择s.studentId、s.name、s.lastName、b.name”);
某人附加(“来自学生s”);
【参考译文】某人借了一本书
s、 studentId=c.studentId”);
sb.追加(“c.bookId=b.bookId上的内部连接图书b”);
queryquery=getSession().createSQLQuery(sb.toString());
query.setProperties(Student.class);
ListsearchResults=query.List();

但是,当我在调试模式的searchResults中检查b.name的值时,它会得到s.name的值。也就是说,b.name与s.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\u name
book\u name

访问您的结果集。您提到您在此处尝试使用别名,但我在任何地方都没有看到这种尝试。不管怎样,事实上这是解决你问题的一种方法。我犯了一个错误。由于以下原因导致整个堆栈过长:com.ibm.db2.jcc.am.SqlException:[jcc][10150][10300][4.14.137]无效参数:未知列名。ERRORCODE=-4460,SQLSTATE=null在com.ibm.db2.jcc.am.ed.a(ed.java:661)在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.reset.findColumnX(ResultSet.java:1932)在com.ibm.db2.jcc.am.ResultSet.result.result.result.jset.get1704在com.ibm.ws.rsadapter.jdbc.wsjdbcsresultset.getString(wsjdbcsresultset.java:2467)00000044 SystemErr R org.hibernate.exception.genericjdbception:无法在org.hibernate.exception.sqlstatecoverter.handlednosspecificeexception(sqlstatecoverter.java:126)org.hibernate.exception.sqlstatecoverter.convert执行查询(sqlstatecoverter.java:114)位于org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66)我不认为这个错误仅仅是由我建议的更改引起的,假设您实际上是作为原始查询运行的。我认为问题发生在您的代码中的其他地方。@草莓AFAIK没有错误的逗号。您在哪里看到它们?@timbiegeleisen s.lastname,-啊,我现在看到另一列了