【问题标题】:Is it possible to use SQL syntax like FROM DUAL in JPA?是否可以在 JPA 中使用 FROM DUAL 之类的 SQL 语法?
【发布时间】:2023-02-04 02:34:58
【问题描述】:

我正在尝试使用 JPQL 的 @Query 创建一个独立的项目,而不管数据库的类型。

如何在 JPA 中实现以下语法?

SELECT MY_SEQ.NEXTVAL FROM DUAL

【问题讨论】:

  • 我在@Query 中将nativeQuery 用作false。
  • 您可能需要将查询作为原始 SQL 运行,因此,您不妨使用 DUAL
  • 我不明白。你的意思是它必须像这样才能用作 DUAL 吗? “从双 d 中选择 d”。我在问如何实现这个。
  • 在 JPA 上下文中使用 NEXTVAL 甚至没有意义,因为 NEXTVAL 与位于 JPA 层后面的 Java 实体无关。
  • DUAL 是特定于 Oracle 的。它甚至不是 SQL 标准。

标签: jpa jpql


【解决方案1】:

简短回答:

对于这种查询,只使用nativeQuery = true 并正常使用它会更有效率。

要使其与数据库无关,理论上您可以在新数据库中创建一个 DUAL 表。

长答案:

简短的回答是你真正要找的。但是为了其他可能因为其他相关原因而通过谷歌掉到这里的人,如果你真的想要它,理论上您可以使用 @Subselect 将 Oracle 的 DUAL 表转换为一个实体,如下所示:

@Table
@Entity
@Subselect("SELECT dummy FROM DUAL")
public class DualEntity {
    @Id
    @Column(name = "dummy")
    private String dummy;
}

其中 dummyDUAL 表中的唯一列。

虽然乍一看这似乎不是很有用,因为大多数此类查询作为本机查询更容易运行,但这确实让我们在数据库函数与数据库中的任何实际表无关时为它们创建存储库接口。数据库。例子:

@Repository
public interface DualRepository extends JpaRepository<DualEntity, String> {

    @Query(nativeQuery = true, value = "SELECT MY_OWNER.MY_FUNCTION(:myParameter) FROM DUAL")
    String myFunction(Long myParameter);

}

同样,这个函数可能应该是你的代码的一部分而不是数据库的一部分,但是旧的应用程序往往有这种东西。程序也可以通过@Query 调用,并且可以从这种映射中受益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多