标签: sqlresultsetmapping

在Java中处理ResultSet的有效方法

我在Java中使用ResultSet,并且不确定如何正确关闭它.我正在考虑使用ResultSet来构造HashMap,然后关闭ResultSet.这种HashMap技术是否有效,或者是否有更有效的方法来处理这种情况?我需要键和值,所以使用HashMap似乎是一个合乎逻辑的选择.

如果使用HashMap是最有效的方法,我如何在我的代码中构造和使用HashMap?

这是我尝试过的:

public HashMap resultSetToHashMap(ResultSet rs) throws SQLException {

  ResultSetMetaData md = rs.getMetaData();
  int columns = md.getColumnCount();
  HashMap row = new HashMap();
  while (rs.next()) {
     for (int i = 1; i <= columns; i++) {
       row.put(md.getColumnName(i), rs.getObject(i));
     }
  }
  return row;
}
Run Code Online (Sandbox Code Playgroud)

java resultset hashmap sqlresultsetmapping

53
推荐指数
4
解决办法
11万
查看次数

带有SqlResultSetMapping和本机查询的JPA数据存储库

我遇到了以下情况:

我的实体彼此相关,但是这样我就无法使用JPQL.我被迫使用原生SQL.现在我想将这些结果映射到ValueObject.要清楚,我不想得到Object array(List<Object[]>)的列表.我有6个实体,我只需要一些列.任何人都可以举例说明如何从本机查询实现这样的映射?

我经历过的教程.

我的代码:

@SqlResultSetMapping(
    name = "findAllDataMapping",
    classes = @ConstructorResult(
            targetClass = MyVO.class,
            columns = {
                    @ColumnResult(name = "userFirstName"),
                    @ColumnResult(name = "userLastName"),
                    @ColumnResult(name = "id"),
                    @ColumnResult(name = "packageName")
            }
    )
)

@NamedNativeQuery(name = "findAllDataMapping",
    query = "SELECT " +
            "    u.first_name as userFirstName, " +
            "    u.last_name as userLastName, " +
            "    i.id as id, " +
            "    s.title as packageName, " +
            "FROM " +
            "    invoice as i " +
            "JOIN user …
Run Code Online (Sandbox Code Playgroud)

java spring sqlresultsetmapping nativequery spring-data-jpa

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

如何使用@SqlResultSetMapping将ONE-TO-MANY本机查询结果映射到POJO类中

我正在使用Java和MySql在后端API中工作,我正在尝试在JPA 2.1中使用@SqlResultSetMapping将ONE-TO-MANY本机查询结果映射到POJO类,这是本机查询:

@NamedNativeQuery(name = "User.getAll”, query = "SELECT DISTINCT t1.ID, t1.RELIGION_ID t1.gender,t1.NAME,t1.CITY_ID , t2.question_id, t2.answer_id  FROM user_table t1 inner join user_answer_table t2 on t1.ID = t2.User_ID“,resultSetMapping="userMapping")
Run Code Online (Sandbox Code Playgroud)

而且,这是我的结果SQL映射:

@SqlResultSetMapping(
            name = "userMapping",
            classes = {
                            @ConstructorResult(
                                    targetClass = MiniUser.class,
                                    columns = {
                                            @ColumnResult(name = "id"),
                                            @ColumnResult(name = "religion_id"),
                                            @ColumnResult(name = "gender"),
                                            @ColumnResult(name = "answers"),
                                            @ColumnResult(name = "name"),
                                            @ColumnResult(name = "city_id")

                                    }
                            ),

                            @ConstructorResult(
                                    targetClass = MiniUserAnswer.class,
                                    columns = {
                                            @ColumnResult(name = "question_id"),
                                            @ColumnResult(name = "answer_id")

                                    }
                              )

            })
Run Code Online (Sandbox Code Playgroud)

而且,这是POJO类的实现:(我刚刚删除了构造函数和getter/setter)

MiniUser类

public …
Run Code Online (Sandbox Code Playgroud)

one-to-many sqlresultsetmapping nativequery jpa-2.1

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

@NamedNativeQuery与@SqlResultSetMapping为非实体

我一直在用这篇文章作为例子.我有一个复杂的连接查询(这里简化).它从两个表(以及使用CASE的派生列)返回值的子集.我认为我不需要使用实体注释,因为从我的结果集返回的对象不是我的架构中的实际表.

我想要保存的非实体对象来自我的连接查询:

@SqlResultSetMapping(
           name="myMapping",
           classes={
              @ConstructorResult(
                   targetClass=CarLimitDelta.class,
                     columns={
                        @ColumnResult(name="caseCol"),
                        @ColumnResult(name="colA"),
                        @ColumnResult(name="colB"),
                        }
              )
           }
)
@NamedNativeQuery(name="CarLimitDelta.getCarLimitDelta", 
        resultSetMapping="myMapping", 
        query="SELECT CASE "+ 
           "WHEN t.foo IS NULL THEN 'INS' "+
           "WHEN s.foo IS NULL THEN 'DEL' "+
           "ELSE 'UPD' "+
        "END caseCol "+
     ", T.bar colA "+
     ", S.bar ColB "+
     "FROM tableA S "+
     "FULL JOIN TableB ON S.bar= T.bar")

public class CarLimitDelta {
        private String caseCol;
        private String colA;
        private String colB;


    //getters/setters/etc
    }
Run Code Online (Sandbox Code Playgroud)

我的回购:

@Repository
public interface CarLimitRepository …
Run Code Online (Sandbox Code Playgroud)

java jpa named-query sqlresultsetmapping spring-data-jpa

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

SqlResultSetMapping列为和实体

我真的很困惑,列结果集映射如何工作?当我使用列而不是实体时,我映射的是什么?看看这个例子......

Query q = em.createNativeQuery(
       "SELECT o.id AS order_id, " +
           "o.quantity AS order_quantity, " +
           "o.item AS order_item, " + 
           "i.name AS item_name, " +
         "FROM Order o, Item i " +
         "WHERE (order_quantity > 25) AND (order_item = i.id)",
       "OrderResults");

   @SqlResultSetMapping(name="OrderResults",
       entities={
           @EntityResult(entityClass=com.acme.Order.class, fields={
               @FieldResult(name="id", column="order_id"),
               @FieldResult(name="quantity", column="order_quantity"),
               @FieldResult(name="item", column="order_item")})},
       columns={
           @ColumnResult(name="item_name")}
       )
Run Code Online (Sandbox Code Playgroud)

我可以理解他在这里要做的是什么,实体结果将是他想要的结果集,字段将尝试将字段映射到别名,列结果到底是做什么的?它看起来不像是映射到任何东西.

java entities jpa sqlresultsetmapping

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

在JPA 2.1中使用Enum的@ConstructorResult

在使用@SqlResultSetMapping的@ConstructorResult时,我不知道如何在@ColumnResult类型中使用Enum

@SqlResultSetMapping(name="DetailAndResult",
        classes={
                @ConstructorResult(targetClass=DetailAndResult.class, columns={
                        @ColumnResult(name="id", type= String.class),
                        @ColumnResult(name="runId", type=Integer.class),
                        @ColumnResult(name="subRunId", type=Integer.class),
                        @ColumnResult(name="transactionId", type=Integer.class),
                        @ColumnResult(name="referenceNumber", type=String.class),
                        @ColumnResult(name="customerName", type=String.class),
                        @ColumnResult(name="transactionType", type=TransactionType.class),
                        @ColumnResult(name="transactionResultStatus", type=String.class)

                })
        }
)
Run Code Online (Sandbox Code Playgroud)

在上面的配置中,名称'transactionType'是TransactionType Enum.在这里使用Enum的正确方法是什么.

如果上面是正确的方法然后我得到这个异常(如果我将删除枚举字段,然后没有异常)所以认为应该有另一种方式来使用它.

Caused by: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:458) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_51]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_51]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:333) ~[spring-orm-4.0.5.RELEASE.jar:4.0.5.RELEASE]
    at com.sun.proxy.$Proxy146.getResultList(Unknown Source) ~[na:na]
Run Code Online (Sandbox Code Playgroud)

使用hibernateTemplate,我们使用的是sqlquery.addscalar,并且有一种方法可以使用org.hibernate.type.Type来使用Enum.

TypeLocatorImpl(new TypeResolver()).custom(EnumType.class, params)
Run Code Online (Sandbox Code Playgroud)

请建议这样的事情是否会用于@SqlResultSetMapping和@ConstructorResult

spring hibernate jpa sqlresultsetmapping jpa-2.1

7
推荐指数
2
解决办法
2319
查看次数

JPA 将原生查询结果映射到非实体 DTO

我有一个复杂的本机查询,我正在尝试将其结果映射到非实体 DTO 类。我正在尝试使用JPA's SqlResultSetMappingwithConstructorResult

我的 DTO 课

@Data
public class Dto {

    private Long id;

    private String serial;

    private Long entry;

    private int numOfTasks;
}
Run Code Online (Sandbox Code Playgroud)

我的实体类,它具有存储库接口,我将称之为本机查询结果。

@SqlResultSetMapping(
        name = "itemDetailsMapping",
        classes = {
                @ConstructorResult(
                        targetClass = Dto.class,
                        columns = {
                                @ColumnResult(name = "ID"),
                                @ColumnResult(name = "SERIAL"),
                                @ColumnResult(name = "ENTRY"),
                                @ColumnResult(name = "TASKS")
                        }
                )
        }
)

@NamedNativeQuery(name = "getItemDetails", query = "complex query is here", resultSetMapping = "itemDetailsMapping")
@Entity
@Data
public class Item {}
Run Code Online (Sandbox Code Playgroud)

存储库

@Repository …
Run Code Online (Sandbox Code Playgroud)

java jpa sqlresultsetmapping spring-data-jpa spring-boot

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

Grails/GORM 中的结果集映射

我想将原生 SQL 查询的结果映射到 grails 中的一个简单 bean,类似于 @SqlResultSetMapping 注释所做的。

例如,给定一个查询

select x.foo, y.bar, z.baz from //etc...

将结果映射到

class FooBarBaz {
  String foo
  String bar
  String baz
}
Run Code Online (Sandbox Code Playgroud)

谁能提供一个如何在 grails 中执行此操作的示例?提前致谢。

grails groovy jpa grails-orm sqlresultsetmapping

5
推荐指数
1
解决办法
2176
查看次数

如何从ResultSetMapping获取关联数组?

我正在研究一个Symfony2项目(Doctrine),我想从ResultSetMapping对象中获取一个简单的关联数组.

这是我的要求:

$rsm = new ResultSetMapping;

//$rsm->addIndexByScalar('name');
$rsm->addScalarResult('name', 'name');
$rsm->addScalarResult('rate', 'rate');

return $this->_em->createNativeQuery(sprintf('
                SELECT DISTINCT t1.sold_drug as name, (COUNT(*)/(SELECT COUNT(*) FROM Transaction t WHERE t.sold_drug != ""))*100 as rate
                         FROM Transaction t1

                 WHERE t1.sold_drug != "" AND t1.prescribed_but_not_sold != "No"
                 GROUP BY name
                 ORDER BY rate DESC', $this->getFilterQuery()), $rsm)->getResult();
Run Code Online (Sandbox Code Playgroud)

所以我想得到一个关联数组,如:

array('nameA' => 10, 'nameB' => 2, ...);
Run Code Online (Sandbox Code Playgroud)

我试图添加ScalarResult/ScalarIndex但没有成功!

任何的想法 ?谢谢 !

doctrine associative-array entitymanager sqlresultsetmapping symfony

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