在 spring-data 中自动发现本机 SQL 查询期间遇到重复的 sql 别名 [id]

问题描述 投票:0回答:1

我有这样的疑问:

@Query(value = "SELECT * FROM t_western_es AS t1 JOIN (SELECT id FROM t_western_es " +
        "ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id", nativeQuery = true)
List<WesternEs> findRandom();

但是我在运行查询时遇到此错误:

There was an unexpected error (type=Internal Server Error, status=500).
Encountered a duplicated sql alias [id] during auto-discovery of a native-sql query
org.springframework.orm.jpa.JpaSystemException: Encountered a duplicated sql alias [id] during auto-discovery of a native-sql query
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:341)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:241)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:550)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:335)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:220)
    at jdk.proxy4/jdk.proxy4.$Proxy156.findRandom(Unknown Source)
java sql mysql spring-boot spring-data-jpa
1个回答
0
投票

这是经常建议避免使用

SELECT *
的原因之一 — 虽然就 MySQL 而言,查询结果中重复的列名是合法的,但客户端实现(本例中为 JPA)可能要求给定结果集的列是独一无二的。

在这种情况下,您可以通过仅从连接表之一返回列来解决错误,这将省略

id
中多余的
t2
列:

@Query(value = "SELECT t_western_es.* FROM t_western_es AS t1 JOIN (SELECT id FROM t_western_es " +
    "ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id", nativeQuery = true)

另一个解决方案是为重复列定义别名以使其不同:

@Query(value = "SELECT * FROM t_western_es AS t1 JOIN (SELECT id AS id2 FROM t_western_es " +
    "ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id2", nativeQuery = true)

(假设第一个表没有名为

id2
的列)

© www.soinside.com 2019 - 2024. All rights reserved.