如何解决java.sql.SQLSyntaxErrorException:ORA-00923:找不到期望的FROM关键字
我正在尝试在名为Account的对象中强制转换本机查询的结果。但是,当我调用API时,会抛出这个错误。有趣的事实是,如果副本将查询粘贴到sql开发人员中,则它可以完美运行,而不会引发“在...处找不到FROM关键字”错误。
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: java.sql.SQLSyntaxErrorException: ORA-00923: FROM keyword not found where expected
这是我的 Foo.java
@Entity
@NamedNativeQuery(
name = "findAllAccounts",query =
"SELECT" +
"Q1.ACCOUNT_NAME AS accountName," +
"Q2.GROUP_NAME AS groupName" +
"FROM USERS_DEV Q1" +
"JOIN USERS_GROUPS Q2 ON Q1.ACCOUNT_NAME = Q2.ACCOUNT_NAME" +
"WHERE LOWER(Q1.ACCOUNT_NAME) = 'john.lenon'",resultSetMapping = "findAllAccountsMapping"
)
@SqlResultSetMapping(
name = "findAllAccountsMapping",classes = @ConstructorResult(
targetClass = Account.class,columns = {
@ColumnResult(name = "accountName"),@ColumnResult(name = "groupName"),}
)
)
@Table(name = "abc")
public class Foo {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@Column(name = "SOME_NUMBER")
private String someNumber;
}
Account.java
public class Account {
String accountName;
String groupName;
public Account(String accountName,String groupName) {
this.accountName = accountName;
this.groupName = groupName;
}
}
FooRepository.java
@Repository
public interface FooRepository extends JpaRepository<Foo,Long> {
@Query(name = "findAllAccounts",nativeQuery = true)
List<Account> getAllAccounts();
解决方法
串联字符串时,不同命令之间没有空格
您的版本
"SELECT" +
"Q1.ACCOUNT_NAME AS accountName," +
"Q2.GROUP_NAME AS groupName" +
"FROM USERS_DEV Q1" +
"JOIN USERS_GROUPS Q2 ON Q1.ACCOUNT_NAME = Q2.ACCOUNT_NAME" +
"WHERE LOWER(Q1.ACCOUNT_NAME) = 'john.lenon'",
因此,您的SQL被“粘合”在一起,并且没有形成正确的SQL(例如SELECTQ1.ACCOUNT_NAME ... AS groupNameFROM USERS_DEV Q1
)
应该如何
"SELECT" +
" Q1.ACCOUNT_NAME AS accountName," +
" Q2.GROUP_NAME AS groupName" +
" FROM USERS_DEV Q1" +
" JOIN USERS_GROUPS Q2 ON Q1.ACCOUNT_NAME = Q2.ACCOUNT_NAME" +
" WHERE LOWER(Q1.ACCOUNT_NAME) = 'john.lenon'",
您需要在每行SQL的末尾(或课程的开始)添加空格。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。