JPQL中的空白FROM子句?

时间:2014-09-05 12:50:06

标签: sql jpa jpql

我正在使用JPQL select来访问Oracle DB函数:select FUNCTION('function_name', 'foo', 1234) from com_mycompany_bar obj

这按预期工作,确实调用了该函数。问题是我实际上不需要FROM子句,而是希望它为空,而不是为了符合语法而必须访问实体。

我在这里有什么最好的选择?

2 个答案:

答案 0 :(得分:4)

我看到几个可能的答案:

在标准JPA中,有两个选项,都涉及Oracle DUAL“table”

  1. DUAL映射到实体并在FROM子句中使用它。这是更“JPQL”的方式,但它涉及的更多:
  2. 在Java代码中:

    @Entity(name = "Dual")
    @Table(name = "SYS.DUAL")
    public class Dual {
        @Id
        @Column(name = "DUMMY")
        private String dummy;
    }
    

    在orm.xml中:

    <named-query name="yourQuery">
        <query><![CDATA[
            SELECT FUNCTION('function_name', 'foo', 1234) FROM Dual d
        ]]>
        </query>
    </named-query>
    

    在客户代码中:

    Query q = entityManager.createNamedQuery("yourQuery");
    
    1. 只需使用使用DUAL
    2. 的原生查询即可

      在orm.xml中:

      <named-native-query name="yourQuery">
          <query><![CDATA[
              SELECT function_name('foo', 1234) from sys.dual
          ]]>
          </query>
      </named-native-query>
      

      在客户代码中:

      Query q = entityManager.createNativeQuery("yourQuery");
      

      作为最后一个选项,您可以对JPA使用一些JPA实现扩展,并避免使用DUAL

答案 1 :(得分:0)

简而言之:我不认为可以跳过JPQL查询的FROM子句

JPQL语法需要 FROM子句(请参阅例如herehere)。

调用存储过程/函数通常通过本机查询完成(请参阅:createNativeQuery)。所以这应该有效:

em.createNativeQuery("select function_name('foo', 1234)").getSingleResult()

更新(来自评论):

JPA原生查询不支持命名参数。所以你必须决定哪两个是你的两个邪恶中的较小者:使用不必要的实体引用的JPQL或者使用位置参数而不是命名的本机查询。

但请注意,FUNCTION是EclipseLink扩展,因此如果您决定更换供应商,它将无法工作。