我正在使用 Spring Boot1.5.13.RELEASE并尝试使用javax.persistence.Tuple来接收来自本机查询的结果,例如:
Query q = em.createNativeQuery(QUERY_STRING, Tuple.class);
q.setParameter(1, param1);
q.getResultList();
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误getResultList:
org.hibernate.MappingException: Unknown entity: javax.persistence.Tuple
Run Code Online (Sandbox Code Playgroud)
根据一些链接,这应该有效。
那么,如何使用Tupleon native 查询呢?是否可以?
谢谢!
我的排序有问题。
存储库方法:
@Query(nativeQuery = true,
value = "SELECT D.ID as dealerId , D.NAME as dealerName, K.ID as kpiId, " +
"K.NAME as kpiName FROM REGION R, DEALER D, KPI K "
+ "WHERE R.IMPORTER_ID = :importerId "
+ "AND D.REGION_ID = R.ID "
+ "AND K.IMPORTER_ID = :importerId ")
Page<DealersKpiTargets> getDealersKpiTargets(@Param("importerId") Long importerId, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
可分页对象:
Page request [number: 0, size 20, sort: name: DESC]
Run Code Online (Sandbox Code Playgroud)
休眠日志:
Hibernate: SELECT D.ID as dealerId , D.NAME as dealerName, K.ID as kpiId, K.NAME as …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现基于接口的投影,但无法使其与我的自定义类型列一起使用。
下面是我正在尝试做的示例:
存储库:
@Query(value = "SELECT customType from TABLE", nativeQuery = true)
List<TestClass> getResults();
Run Code Online (Sandbox Code Playgroud)
界面投影:
public interface TestClass {
@Convert(converter = MyCustomTypeConverter.class)
MyCustomType getCustomType();
}
Run Code Online (Sandbox Code Playgroud)
转换器:
@Converter
public class MyCustomTypeConverter implements Converter<String, MyCustomType> {
@Override
public MyCustomType convert(String source) {
// whatever
}
}
Run Code Online (Sandbox Code Playgroud)
当我在存储库上调用 getResults() 时,我会按预期收到结果列表,但是当我尝试对其中一个结果调用 getCustomType() 时,出现异常:
java.lang.IllegalArgumentException: Projection type must be an interface!
at org.springframework.util.Assert.isTrue(Assert.java:118)
at org.springframework.data.projection.ProxyProjectionFactory.createProjection(ProxyProjectionFactory.java:100)
at org.springframework.data.projection.SpelAwareProxyProjectionFactory.createProjection(SpelAwareProxyProjectionFactory.java:45)
at org.springframework.data.projection.ProjectingMethodInterceptor.getProjection(ProjectingMethodInterceptor.java:131)
at org.springframework.data.projection.ProjectingMethodInterceptor.invoke(ProjectingMethodInterceptor.java:80)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.projection.ProxyProjectionFactory$TargetAwareMethodInterceptor.invoke(ProxyProjectionFactory.java:245)
Run Code Online (Sandbox Code Playgroud)
我发现问题出在
org.springframework.data.projection.ProxyProjectionFactory
Run Code Online (Sandbox Code Playgroud)
它使用
org.springframework.core.convert.support.DefaultConversionService
Run Code Online (Sandbox Code Playgroud)
这显然没有注册我的自定义类型转换器。
如果我在 ConversionService 中的断点处停止并在运行时手动添加我的转换器,投影将正常工作。 …
我想用Doctrine2映射一个sql-view 。
此视图是一个TempTable,其中包含一些统计信息,这些统计信息无需重写生成视图的sql即可显示
我尝试像表一样映射,但是更新架构会删除视图并创建表
我也尝试使用NativeSQL ...
public function getMessages(\Project\Bundle\MyBundle\Entity\User $user) {
$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$rsm->addEntityResult('MessageCenter', 'v');
$rsm->addFieldResult('v', 'user_id', 'user_id');
$rsm->addFieldResult('v', 'tot', 'tot');
$rsm->addFieldResult('v', 'read', 'read');
$rsm->addFieldResult('v', 'to_read', 'to_read');
$rsm->addFieldResult('v', 'stored', 'stored');
$rsm->addFieldResult('v', 'spam', 'spam');
$q = "SELECT * FROM message_stats_view WHERE user_id = ?";
$rsm = new \Doctrine\ORM\Query\ResultSetMapping;
$query = $this->getEntityManager()->createNativeQuery($q, $rsm);
$query->setParameter(1, $user->getId());
echo $query->getSQL();
var_dump($query->execute());
exit;
}
Run Code Online (Sandbox Code Playgroud)
我使用getter和setter创建了实体MessageCenter,但是我的输出是:
SELECT * FROM message_stats_view WHERE user_id = ?
array
empty
Run Code Online (Sandbox Code Playgroud) 我在Symfony2项目中使用KnpPaginatorBundle。当我尝试将Doctrine 2本机查询传递给分页程序实例时,出现错误:
One of listeners must count and slice given target
Run Code Online (Sandbox Code Playgroud)
有没有人为某些本机查询提供此示例的正确实现示例?
在bundle的文档中,我看到了示例(https://github.com/KnpLabs/KnpPaginatorBundle/blob/master/Resources/doc/custom_pagination_subscribers.md),但仅适用于文件系统,我不知道如何将其转换为db查询。
你能帮我吗?
编辑
我的查询:
SELECT a.*, highest_rated_book.*
FROM authors a
LEFT JOIN (SELECT * FROM books b ORDER BY b.rate DESC) AS highest_rated_book
ON a.id = highest_rated_book.author_id
GROUP BY highest_rated_book.author_id
ORDER BY a.id;
Run Code Online (Sandbox Code Playgroud)
和表:
author (id, first_name, last_name)
books (id, title, rate, author_id)
Run Code Online (Sandbox Code Playgroud) 例如,我有一个表作为学生它包含像id,name,age这样的列 我通过使用NativeQuery来恢复特定的列值,如下所示.
Query query = entityManager.createNativeQuery("SELECT age FROM Student");
List list=query.getResultList();
Run Code Online (Sandbox Code Playgroud)
通过使用上面的查询我们将获得学生表中的年龄列表现在我想从表中获取年龄和名称.
Query query = entityManager.createNativeQuery("SELECT age,name FROM Student");
List list=query.getResultList();
Run Code Online (Sandbox Code Playgroud)
如果我喜欢这样,我的代码执行得很好,但是如何在一个列表中获取名称并在另一个列表中显示年龄.那么我该怎么做呢.非常感谢你
注意 我的项目中没有任何Entity类或POJO类我使用Native Query从数据库获取表.
我有很多EntityManager,每个模式我有一个(我使用entity-mappings文件映射EMs与模式).有用.
当我使用@NamedQuery它的工作就像一个魅力,但当我使用@NamedNativeQuery架构时不使用.我必须符合条件SELECT foo FROM schema.table.
这是正确的行为吗?
我认为参数@NamedNativeQuery动态传递模式是不可能的(我相信只有列可以是动态而不是表或模式或其他任何东西)所以我如何使用@NamedNativeQuery动态模式呢?
我需要在Spring Data中实现这样的查询: -
Select User.name, sum(Activity.minutes)
From User, Activity, ActivityStatus
Where User.id = ActivityStatus.userId
And Activity.id = ActivityStatus.activityId
AND ActivityStatus = "COMPLETED"
GROUP BY user.name;
Run Code Online (Sandbox Code Playgroud)
所以我需要参加3个表,所以我必须使用@Query与nativeQuery = true(纠正我,如果我错了这里)
所以我的Repository方法看起来像这样: -
@Query(value = "Select User.name, sum(Activity.minutes) as total_minutes
From User, Activity, ActivityStatus
Where User.id = ActivityStatus.userId
And Activity.id = ActivityStatus.activityId
AND ActivityStatus = "COMPLETED"
AND User.Type = ?1
GROUP BY user.name;",
nativeQuery = true
)
List<MyObj> getTotalActivityMinutesByUserType(String userType);
Run Code Online (Sandbox Code Playgroud)
MyObj class看起来像这样: -
public class MyObj {
String name; …Run Code Online (Sandbox Code Playgroud) 基于我的上一篇文章:Spring JPA long SQL String for NativeQuery
我设法找到一个“地方”来编写干净的 SQL,以便我可以直接将其复制并粘贴到数据库软件中以加快测试速度。
但另一个问题来了,如果我想隔离我的 orm.xml 文件,比如:
我尝试按上面所示重命名文件,但它说在启动过程中找不到文件中的方法。知道如何让项目理解多个 orm.xml 文件吗?
我正在工作中开发一个基本的网络应用程序。我必须使用一些 sql server 视图。我决定尝试本机查询,一旦测试了它的功能,就尝试编写一些类来编码所有查询,但有点忘记了它们的实现。
所以我的问题是,我在 Acme/MyBundle/Entity/View1.php 中有一个实体。该实体拥有与表匹配的所有属性以及它的 getter 和 setter。我想这个实体很好地映射到数据库(Doctrine 不能轻松地使用视图)。
我的目标是让控制器能够从这些视图(SQL SERVER)中获取一些数据并将其返回到视图(twig),以便它可以显示信息。
$returned_atts = array(
"att1" => $result[0]->getAttribute1(), //getter from the entity
"att2" => $result[1]->getAttribute2(), //getter from the entity
);
return $returned_atts;`$sql = "SELECT [Attribute1],[Attribute2],[Attribute3] FROM [TEST].[dbo].[TEST_VIEW1]"; //THIS IS THE SQL SERVER QUERY
$rsm = new ResultSetMapping($em); //result set mappin object
$rsm->addEntityResult('Acme\MyBundle\Entity\View1', 'view1'); //entity which is based on
$rsm->addFieldResult('view1', 'Attribute1', 'attribute1'); //only choose these 3 attributes among the whole available
$rsm->addFieldResult('view1', 'Attribute2', 'attribute2');
$rsm->addFieldResult('view1', 'Attribute3', 'attribute3');
//rsm built
$query …Run Code Online (Sandbox Code Playgroud) nativequery ×10
java ×4
doctrine-orm ×3
jpa ×3
hibernate ×2
symfony ×2
bundle ×1
converters ×1
dto ×1
eclipselink ×1
entity ×1
knppaginator ×1
mapping ×1
orm ×1
projection ×1
schema ×1
sorting ×1
spring ×1
spring-boot ×1
spring-data ×1
sql ×1
sql-view ×1
temp-tables ×1
tuples ×1