我有这样的疑问:

@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)

推荐答案

这就是经常建议避免使用SELECT *的一个原因——尽管重复列名在查询结果中是合法的,就MySQL而言,客户端实现(在本例中是JPA)可能要求给定结果集的列是唯一的.

在本例中,您可以通过只返回其中一个连接表中的列来解决错误,这将省略t2中多余的id列:

@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的列.)

第三种 Select 是使用JOIN...USING语法,这样可以消除用于连接的重复列名:

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

Java相关问答推荐

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

在Spring Boot中测试时出现SQL语法错误

如何在Spring Security中设置CustomLogin路径?

Mat. n_Delete()和Mat. n_release的区别

最小拓Flutter 排序的时间复杂度是多少?

屏蔽字母数字代码的Java正则表达式

无法传递消费者<;>;实例

使用java访问具体子类特定方法的最佳方法是什么?

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

暂停计时器

我正在try 跟踪数组中最大的两个数字

有没有更快的方法在N个容器中删除重复项?

将ByteBuffer异步写入InputStream或Channel或类似对象

Java 21中泛型的不兼容更改

RestTemplate Bean提供OkHttp3ClientHttpRequestFactory不支持Spring Boot 3中的请求正文缓冲

不能在 map 上移除折线

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

SonarQube在合并升级到java17后对旧代码提出错误

关于正则表达式的一个特定问题,该问题与固定宽度负向后看有关