Java 如何将下面的SQL转换为JPQL?

Java 如何将下面的SQL转换为JPQL?,java,sql,oracle,jpql,Java,Sql,Oracle,Jpql,如何将下面的SQL转换为JPQL SELECT * FROM SSSRC.NAME_TEST nameTest LEFT JOIN TTREFERENCE.LOCATION location ON nameTest.place= location.location_name WHERE nameTest.gender = 'Male' AND nameTest.age= '50' AND nameTest.name IS NOT NULL ORDER BY nameTest.sortby ,l

如何将下面的SQL转换为JPQL

SELECT *
FROM SSSRC.NAME_TEST nameTest
LEFT JOIN TTREFERENCE.LOCATION location
ON nameTest.place= location.location_name WHERE nameTest.gender = 'Male'
AND nameTest.age= '50'
AND nameTest.name IS NOT NULL 
ORDER BY nameTest.sortby ,location.location_order;
我喜欢这样

"SELECT nameTest FROM NameTest nameTest, LEFT JOIN Location location ON nameTest.place = location.location_name WHERE nameTest.age= '50' and nameTest.gender = 'Male' and nameTest.name IS NOT NULL ORDER BY nameTest.sortby ,location.location_order";
但是

它不工作,它的错误如下

Exception in thread "main" <openjpa-2.0.0-r422266:935683 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: "Encountered "location" at character 66, but expected: [",", "GROUP", "HAVING", "INNER", "JOIN", "LEFT", "ORDER", "WHERE", <EOF>]." while parsing JPQL "SELECT nameTest FROM PrintRequest nameTest, LEFT JOIN LOCATION location ON nameTest.place = location.location_name WHERE nameTest.age= '50' and nameTest.gender = 'Male' and nameTest.name IS NOT NULL ORDER BY nameTest.sortby ,location.location_order";. See nested stack trace for original parse error.
      at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:51)
      at org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:150)
      at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:670)
      at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:652)
      at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:618)
      at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:680)
      at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:587)
      at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:985)
线程“main”org.apache.openjpa.persistence.ArgumentException中的异常:“在字符66处遇到“位置”,但在解析JPQL时应为:[“,”,“组”,“有”,“内部”,“连接”,“左”,“顺序”,“其中”,]”“从PrintRequest nameTest中选择nameTest,左连接nameTest.place=LOCATION.LOCATION\u name,其中nameTest.age='50'和nameTest.gender='Male',nameTest.name按nameTest.sortby、LOCATION.LOCATION\u顺序不为空”;。有关原始解析错误,请参阅嵌套堆栈跟踪。 位于org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:51) 位于org.apache.openjpa.kernel.ExpressionStoreQuery.newcommpilation(ExpressionStoreQuery.java:150) 位于org.apache.openjpa.kernel.QueryImpl.newcommpilation(QueryImpl.java:670) 位于org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:652) 位于org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:618) 位于org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:680) 位于org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:587) 位于org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:985) 试试这个:

"SELECT nameTest
FROM NameTest as nameTest
LEFT JOIN Location
ON nameTest.place = Location.location_name
WHERE nameTest.age = '50' and
nameTest.gender = 'Male' and
nameTest.name IS NOT NULL
ORDER BY nameTest.sortby, Location.location_order";
您可以尝试以下代码:

    "SELECT nameTest FROM NameTest nameTest 

    LEFT JOIN Location location ON nameTest.place = location.location_name 

    WHERE nameTest.age= '50' and nameTest.gender = 'Male' and nameTest.name IS NOT NULL 

    ORDER BY nameTest.sortby, location.location_order";
注释ON子句在JPA 2.1中定义,并且在hibernate支持中受支持。请检查以下答案:


在我看来,您的JPA不支持ON子句。对于简单的左连接,您需要更改您的实体。例如,NameTest类有一个Location元素:

public class NameTest{

  @JoinColumn(name = "locationId", referencedColumnName = "location")
  @ManyToOne()
  Location location;

(...)
}
在本例中,JPQL如下所示:

SELECT nameTest FROM NameTest nameTest 

        LEFT JOIN nameTest.location location 

        WHERE nameTest.age= '50' and nameTest.gender = 'Male' and nameTest.name IS NOT NULL 

        ORDER BY nameTest.sortby, location.location_order

删除“,”在“NameTest”和“LEFT JOIN”之间的“,”我遇到以下错误“,”在字符61处遇到“JOIN Location AS”,但应为:[“,”AS“,”FETCH“,”INNER“,”JOIN“,”LEFT“,]”。“@stacktome我已经更新了我的答案,所以你可以尝试新的变体,直到我在字符55处遇到“LEFT JOIN Location ON”相同的错误为止,但应为:[“,”FETCH“,”INNER“,”JOIN“,”LEFT“,]”解析JPQL时,“从nameTest中选择nameTest作为nameTest上的nameTest左连接位置。place=Location.Location\u name其中nameTest.age='50'和nameTest.gender='Male'和nameTest.name按nameTest.sortby、Location.Location\u顺序不为空”;“@stacktome检查另一个答案,可能是这样的