Java 本机查询 - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

Java native query - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

我收到以下错误:"com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'Card.findPrefix'"

for:

    @NamedNativeQueries({
        @NamedNativeQuery(name = "Card.findPrefix",
                query = "SELECT DISTINCT(FLOOR(c

    .number/10000)) FROM Card c")
    })

    public List<Integer> findPrefix(){
            Query q = em.createNativeQuery("Card.findPrefix");
            try{
                return q.getResultList();
            }catch(Exception ex){
                ex.printStackTrace();
                return null;
            }
        }

我不明白我的错误在哪里,因为当我直接向 Mysql 输入此查询时,它工作得很好。

使用应该使用createNamedQuery,而不是createNativeQuery。

来自EntityManager JavaDoc

createNativeQuery(String sqlString)

创建用于执行本机 SQL 语句的 Query 实例,例如更新或删除。

createNamedQuery(字符串名称)

创建用于执行命名查询的 Query 实例(使用 Java 持久性查询语言或本机 SQL)。

所以在您的代码中,您正在执行查询名称 'Find....' 作为 SQL 查询。

正确的:

Query q = em.createNamedQuery("Card.findPrefix");

最终代码为:

public List<Integer> findPrefix(){
        Query q = em.createNamedQuery("Card.findPrefix");
        List<Integer> res = new ArrayList<Integer>();
        for(Object row : (List<Object>) q.getResultList()){
            res.add(((BigInteger)row).intValue());
        }
        return res;
    }
    @NamedNativeQueries({
    @NamedNativeQuery(name = "Card.findPrefix",
            query = "SELECT DISTINCT(FLOOR(c.number/10000)) FROM Card c")
})