标签: native-sql

查询,本机查询,命名查询和键入查询之间的区别

查询,本机查询,命名查询和类型查询之间有什么区别?"孤独的"查询是否存在,或者它只是一个缩写?在我看来,本机Query是用简单的sql编写的查询,而命名查询是与实体(hibernate-mapping)相关.有人能简单解释一下吗?

sql hibernate jpa native-sql

61
推荐指数
1
解决办法
6万
查看次数

在Hibernate中使用本机SQL查询将结果集添加到DTO中

我有一个如下查询

select f.id, s.name, ss.name
from first f
left join second s on f.id = s.id
left join second ss on f.sId = ss.id
Run Code Online (Sandbox Code Playgroud)

如果我可以使用HQL,我会使用HQL构造函数语法直接用结果集填充DTO.但是,由于hibernate不允许左连接而没有关联,我必须使用Native SQL Query.

目前,我循环遍历JDBC样式的结果集并填充DTO对象.有没有更简单的方法来实现它?

java orm hibernate resulttransformer native-sql

37
推荐指数
1
解决办法
6万
查看次数

Hibernate Native SQL Query检索实体和集合

这是我的情况,我有两个基本的POJO,我已经给出了一个简单的hibernate映射:

Person
  - PersonId
  - Name
  - Books

Book
  - Code
  - Description
Run Code Online (Sandbox Code Playgroud)

我的SQL查询返回如下所示的行:

PERSONID NAME       CODE DESCRIPTION
-------- ---------- ---- -----------
1        BEN        1234 BOOK 1
1        BEN        5678 BOOK 2
2        JOHN       9012 BOOK 3
Run Code Online (Sandbox Code Playgroud)

我的hibernate查询如下所示:

session.createSQLQuery("select personid, name, code, description from person_books")  
       .addEntity("person", Person.class)
       .addJoin("book", "person.books")
       .list();
Run Code Online (Sandbox Code Playgroud)

这是每节:18.1.3的hibernate文档:http: //docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17464

我期望在我的列表中得到的是2个人物对象,其中包含书籍集合中的书籍对象:

List
 |- Ben
 |   |- Book 1
 |   '- Book 2
 '- John
     '- Book 3
Run Code Online (Sandbox Code Playgroud)

我实际看到的是:

List
 |- Object[]
 |   |- Ben
 |   | …
Run Code Online (Sandbox Code Playgroud)

java hibernate native-sql

19
推荐指数
3
解决办法
5万
查看次数

使用@Formula的Hibernate实体的本机SQL查询会导致NullPointerException

我有一个简单的Hibernate实体,我使用@Formula annotion:

    @Id
private Long id;

private String name;

@Formula("(select count(f.*) from foo f where f.id = id)")
private long bar;
Run Code Online (Sandbox Code Playgroud)

当我尝试使用本机SQL查询加载实体时:

EM.createNativeQuery("SELECT f.*, count(something) as bar FROM foo f WHERE f.name = '...'", Entity.class)
Run Code Online (Sandbox Code Playgroud)

我得到一个NullPointerException:

java.lang.NullPointerException
at org.hibernate.loader.DefaultEntityAliases.intern(DefaultEntityAliases.java:193)
at org.hibernate.loader.DefaultEntityAliases.getSuffixedPropertyAliases(DefaultEntityAliases.java:151)
at org.hibernate.loader.DefaultEntityAliases.determinePropertyAliases(DefaultEntityAliases.java:93)
at org.hibernate.loader.DefaultEntityAliases.<init>(DefaultEntityAliases.java:65)
at org.hibernate.loader.ColumnEntityAliases.<init>(ColumnEntityAliases.java:45)
at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.generateCustomReturns(SQLQueryReturnProcessor.java:197)
at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:152)
at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)
at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:140)
at org.hibernate.impl.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:160)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:179)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236)
Run Code Online (Sandbox Code Playgroud)

当我删除@Formula属性时,一切正常.

我发现了这个错误报告:BugReport.但对我来说,目前还不清楚如何解决我的问题.

hibernate formula native-sql

12
推荐指数
1
解决办法
9985
查看次数

什么时候应该使用JPA 2.0而不是JPQL或CriteriaBuilder的本机查询?

关于何时以及何时不在JPA 2.0中使用本机查询,我感到非常困惑.我的印象是使用本机查询可能会导致我与JPA缓存不同步.如果我可以使用JPQL或CriteriaBuilder查询完成同样的事情,是否有充分的理由使用本机查询?同样,如果我可以使用JPQL或CriteriaBuilder完成同样的事情,那么使用本机查询是否有任何危险?最后,如果使用本机查询存在危险,与JPA缓存不同步,使用JPQL或CriteriaBuilder执行等效查询是否存在同样的危险?

我的理念是避免本地查询,但肯定有时候它们是必要的.在我看来,如果我可以使用JPQL或CriteriaBuilder,那么我应该.

谢谢.

jpql native-sql jpa-2.0

8
推荐指数
1
解决办法
3288
查看次数

如何在纯JPA中为本机查询配置默认数据库模式?

我们的情况如下:

  • 我们使用(必须纯粹的)JPA来持久化我们的企业应用程序.
  • 由于性能原因,我们在这里使用了许多相当复杂的本机查询.
  • 访问数据库(Oracle 11g)时,我们使用的数据库用户APP_ACCESS与表(APP_OWNER)的"所有者"不同.这是数据库管理的一项硬性要求.
  • 目前,模式名称(APP_OWNER)被硬编码到本机查询中,a-la:

"SELECT * FROM " + DatabaseSchemaConstants.SCHEMA_NAME + ".LOCATION"

毋庸置疑,我们对此硬编码并不特别满意,因为"所有者"用户名的更改意味着代码中的更改 - 这对于维护来说绝对不利.

所以这是我的问题:

我们如何在纯JPA中为本机查询配置默认数据库模式?

这是我到目前为止发现的:

如何在JPA配置中设置默认架构名称?

具体来说,这个答案提出了持久性单元和orm.xml文件的组合:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">
 <persistence-unit-metadata>

  <persistence-unit-defaults>
   <schema>myschema</schema>
  </persistence-unit-defaults>
 </persistence-unit-metadata>
</entity-mappings>
Run Code Online (Sandbox Code Playgroud)

但我认为这不适用于本机查询(我们目前正在测试它).这里的另一个问题orm.xml是不是真的用于配置.(但它仍然比Java代码中的硬编码更好).

另一篇帖子有类似答案:

JPA - EclipseLink - 如何更改默认架构

还有一个问题:

从会话工厂以编程方式获取hibernate默认模式名称?

看到这个建议使用的答案{h-schema}.看起来很合适,但它是特定于Hibernate的.我们想继续使用"纯JPA".另一个问题是我在Hibernate文档中找不到{h-schema}的任何提及,因此我们依赖此功能是不安全的.

是否有标准的JPA方式为所有内容设置默认数据库架构 - JPA entites和查询以及本机查询

或者,如果我们能够在我们的本机查询中使用配置中的某些"参数"或"设置",则可以解决此问题.

java oracle hibernate jpa native-sql

8
推荐指数
1
解决办法
6681
查看次数

Hibernate Native SQL 查询在连接中检索多个实体

参考这个相关线程的答案,ehrhardt 发布的技巧效果很好。

但是,如果我必须加入多个实体,我该怎么办?例如:

List<Person> peopleWithBooks = session.createSQLQuery(
    "select {p.*}, {b.*}, {m.*} from person p, book b, magazine m where <complicated join>")
        .addEntity("p", Person.class)
        .addJoin("b", "p.books")
        .addJoin("m", "p.magazines")
        .addEntity("p", Person.class)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
        .list();
Run Code Online (Sandbox Code Playgroud)

Hibernate 聚合第一个连接,但不聚合第二个(杂志实体未分组)。

有什么技巧或者有限制只能加入一个相关实体吗?如果我必须加入具有子实体的实体?(我的目标是仅使用一个自定义查询来检索所有选定的数据)

java hibernate native-sql

5
推荐指数
0
解决办法
2390
查看次数

如何在本机查询列上使用Doctrine2类型转换

无法找到任何相关内容 - 看起来它应该是直截了当的.

因此,Doctrine2文档为绑定参数提供类型转换的示例如下所示:

$date = new \DateTime("2011-03-05 14:00:21");
$stmt = $conn->prepare("SELECT * FROM articles WHERE publish_date > ?");
$stmt->bindValue(1, $date, "datetime");
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

我想要做的是为其中一列指定类型转换,但是我找不到文档或StackOverflow中的任何内容.这可能是一个伪示例:

$stmt = $conn -> prepare("SELECT datetime FROM articles WHERE id = 1");
$stmt -> setType(0, "date_type"); // 0 being the column position, "date_type" being the PHP type to convert to
Run Code Online (Sandbox Code Playgroud)

如果有人知道如何做到这一点(这是SQL而不是DQL),我将不胜感激.谢谢.

type-conversion native-sql doctrine-orm

4
推荐指数
1
解决办法
2951
查看次数

Hibernate =未找到列

我通过Hibernate运行Java中的聚合函数,由于某种原因它给我这个错误:

INFO Binary:182 - could not read column value from result set: l_date; Column 'l_date' not found. 
Run Code Online (Sandbox Code Playgroud)

当我运行MySQL查询时,列名是l_date和登录,我无法弄清楚为什么它没有找到它.

我在MySQL中测试了查询并验证它确实有效.我的功能如下.

public List<Logins> getUserLoginsByMonth() {
     Session session = getSessionFactory().openSession();
     ArrayList<Logins> loginList = null; 

     try {
          String SQL_QUERY = "SELECT l_date as l_month, SUM(logins) as logins FROM (SELECT DATE_FORMAT(login_time, '%M') as l_date, COUNT(DISTINCT users) as logins FROM user_logins WHERE login_time > DATE_SUB(NOW(), INTERVAL 1 YEAR) GROUP BY DATE(login_time)) AS Z GROUP BY(l_month)";

          Query query = session.createSQLQuery(SQL_QUERY);
          List results = query.list();
          for(ListIterator iter = …
Run Code Online (Sandbox Code Playgroud)

java orm hibernate native-sql

4
推荐指数
1
解决办法
4005
查看次数

hibernate throw:在""之后发现了一个意外的令牌""

我有一个本机SQL查询,我想通过hibernate运行,但抛出一个错误:

org.hibernate.exception.SQLGrammarException:
could not execute native bulk manipulation query
Caused by: 
com.ibm.db2.jcc.am.SqlSyntaxErrorException: An unexpected token ""
was found following "".  Expected tokens may include:  "NQ_EXE_ID = 12345"
Run Code Online (Sandbox Code Playgroud)

我运行以执行更新的代码是:

SQLQuery updateQuery = getSession().createSQLQuery(updateSql);
System.out.println(updateQuery.getQueryString());    
updateQuery.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

在调试期间,我可以看到SQLQuery对象内部和sql是:(在db2中运行正常)

UPDATE some_table SET DEST_FLDR = 'some_value' ,
LST_CHG_TMS = CURRENT TIMESTAMP
WHERE SUB_RUN_ID = 111111    
AND INQ_EXE_ID = 12345   ;
Run Code Online (Sandbox Code Playgroud)

如果我手动运行上面代码生成的sql,它将执行正常.但是,当我尝试通过hibernate执行它时会抛出'syntaxErrorException'.有任何想法吗?谢谢

db2 hibernate native-sql

2
推荐指数
1
解决办法
2556
查看次数

如何使用 tortoise ORM 执行本机 SQL

我想使用tortoise ORM来执行原生SQL。我应该怎么办?我找不到执行此操作的方法或类。

python native-sql tortoise-orm

2
推荐指数
1
解决办法
3686
查看次数

使用Native SQL Hibernate从存储过程中检索值

以下是存储过程:

create or replace procedure 
proc_emp_name(v_emp out emp.emp_name%TYPE, v_empid in emp.emp_id%TYPE)
is
begin
select emp_name into v_emp from emp where emp_id = v_empid;
dbms_output.put_line('Emp Name: ' || v_emp);
dbms_output.put_line('Procedure created successfully!!!');
end;
Run Code Online (Sandbox Code Playgroud)

我想使用Native SQL调用它,遵循此链接但不确定如何检索 OUT从过程中参数.

http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

请告诉我最简单的方法来调用该过程并从中获取结果.

编辑

正如建议,检查文档,我修改了Proc有第一个参数SYS_REFCURSOR如下:

create or replace procedure
proc_empname_refcursor(v_empname OUT SYS_REFCURSOR, v_deptid in emp.emp_id%type)
is 
begin
open v_empname for select * from dept where dept_id = v_deptid;
end;
Run Code Online (Sandbox Code Playgroud)

我能够使用它来调用它,NamedQuery但由于其他一些限制,我不想在映射文件中添加任何内容.我试过下面的代码来调用proc而不使用NamedQuery但是没有解决:

Query query = session.createSQLQuery(
                "CALL proc_empname_refcursor(?, :deptId)")
                .addEntity(Dept.class)
                .setParameter("deptId", …
Run Code Online (Sandbox Code Playgroud)

java orm hibernate hibernate-mapping native-sql

1
推荐指数
1
解决办法
2万
查看次数

Spring Data Native query pagination not working

I am using Spring Boot 2.0.2.RELEASE with Spring Data JPA. I am trying to do implement pagination with native query in MySql, my code is :

@Query(nativeQuery=true, value = "SELECT DISTINCT ud.latitude,ud.longitude,u.user_id userId FROM users u \n" +
            "INNER JOIN user_devices ud ON u.id = ud.user_id\n" +
            "WHERE ud.access_token IS NOT NULL AND ud.user_id <> 1\n" +
            "ORDER BY calculateDistanceByLatLong(:userLat, :userLong, ud.latitude, ud.longitude) ASC \n#pageable\n",
            countQuery = "SELECT COUNT(DISTINCT u.id) FROM users u \n" +
                    "INNER JOIN user_devices ud ON …
Run Code Online (Sandbox Code Playgroud)

java mysql native-sql spring-data spring-boot

0
推荐指数
1
解决办法
6753
查看次数