我在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) 我遇到了以下情况:
我的实体彼此相关,但是这样我就无法使用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和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) 我一直在用这篇文章作为例子.我有一个复杂的连接查询(这里简化).它从两个表(以及使用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) 我真的很困惑,列结果集映射如何工作?当我使用列而不是实体时,我映射的是什么?看看这个例子......
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)
我可以理解他在这里要做的是什么,实体结果将是他想要的结果集,字段将尝试将字段映射到别名,列结果到底是做什么的?它看起来不像是映射到任何东西.
在使用@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
我有一个复杂的本机查询,我正在尝试将其结果映射到非实体 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) 我想将原生 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 中执行此操作的示例?提前致谢。
我正在研究一个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
java ×5
jpa ×5
jpa-2.1 ×2
nativequery ×2
spring ×2
doctrine ×1
entities ×1
grails ×1
grails-orm ×1
groovy ×1
hashmap ×1
hibernate ×1
named-query ×1
one-to-many ×1
resultset ×1
spring-boot ×1
symfony ×1