我假设我需要构建一个本机查询来使用Doctine2截断表.
$emptyRsm = new \Doctrine\ORM\Query\ResultSetMapping();
$sql = 'TRUNCATE TABLE Article';
$query = em()->createNativeQuery($sql, $emptyRsm);
$query->execute();
Run Code Online (Sandbox Code Playgroud)
这给出了错误
SQLSTATE[HY000]: General error
Run Code Online (Sandbox Code Playgroud)
我需要更改为我的代码才能使其工作?
我知道我可以在JPA中将列表传递给命名查询,但NamedNativeQuery怎么样?我尝试了很多方法,但仍然无法将列表传递给NamedNativeQuery.任何人都知道如何将列表传递给NamedNativeQuery中的in子句?非常感谢你!
NamedNativeQuery如下:
@NamedNativeQuery(
name="User.findByUserIdList",
query="select u.user_id, u.dob, u.name, u.sex, u.address from user u "+
"where u.user_id in (?userIdList)"
)
Run Code Online (Sandbox Code Playgroud)
它被称为这样:
List<Object[]> userList = em.createNamedQuery("User.findByUserIdList").setParameter("userIdList", list).getResultList();
Run Code Online (Sandbox Code Playgroud)
但结果并不像我预期的那样.
System.out.println(userList.size()); //output 1
Object[] user = userList.get(0);
System.out.println(user.length); //expected 5 but result is 3
System.out.println(user[0]); //output MDAVERSION which is not a user_id
System.out.println(user[1]); //output 5
System.out.println(user[2]); //output 7
Run Code Online (Sandbox Code Playgroud) 我有一个User实体和一个Role实体.关系定义如下:
@OneToMany
@JoinTable(name="USER_ROLES", inverseJoinColumns=@JoinColumn(name="ROLE_ID"))
private List<Role> roles = null;
Run Code Online (Sandbox Code Playgroud)
现在,当我删除一个角色时,我需要从具有该角色的所有用户中删除该角色.通常,您可以通过查找具有此角色的所有用户,从列表中删除角色以及保存用户来执行此类操作.但是,当可能有超过一百万用户时,我不想在应用程序中循环这么多实体.所以,我想使用本机查询从USER_ROLES连接表中删除行.我尝试将其添加到我的存储库:
@Query(value="DELETE FROM user_roles WHERE role_id = ?1", nativeQuery=true)
public void deleteRoleFromUsersWithRole(Long roleId);
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我在日志中看到以下内容:
[EL Fine]: sql: 2013-11-02 14:27:14.418--ClientSession(707349235)--Connection(2096606500)--Thread(Thread[http-bio-8080-exec-4,5,main])--DELETE FROM user_roles WHERE role_id = ?
bind => [1000110139999999953]
[EL Fine]: sql: 2013-11-02 14:27:14.478--ClientSession(707349235)--Thread(Thread[http-bio-8080-exec-4,5,main])--SELECT 1
[EL Warning]: 2013-11-02 14:27:14.482--UnitOfWork(1795045370)--Thread(Thread[http-bio-8080-exec-4,5,main])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: No results were returned by the query.
Error Code: 0
Call: DELETE FROM user_roles WHERE role_id = …Run Code Online (Sandbox Code Playgroud) 我正在使用Hibernate.我写了一些原生查询,因为我需要使用sub select语句.
查询看起来像这样:
SELECT sub.rownum FROM
(SELECT k.`news_master_id` AS id, @row := @row + 1 AS rownum
FROM keyword_news_list k
JOIN (SELECT @row := 0) r
WHERE k.`keyword_news_id` = :kid
ORDER BY k.`news_master_id` ASC) AS sub
WHERE sub.id = :nid
Run Code Online (Sandbox Code Playgroud)
当我像这样运行此查询时:
sessionFactory.getCurrentSession()
.createSQLQuery(query)
.setParameter("kid", kid)
.setParameter("nid", nid)
.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
出现此异常:
org.hibernate.QueryException: Space is not allowed after parameter prefix ':' ....
Run Code Online (Sandbox Code Playgroud)
这可能是因为:=操作员.我发现了一些Hibernate问题.这个问题仍然存在.这个问题没有解决办法吗?
我遇到了以下情况:
我的实体彼此相关,但是这样我就无法使用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) 我正在使用本机sql查询,其中我有一个玩家表,我加入三次,首先得到击球手的名字,然后获得投球手的名字,然后获得外野手的名字.现在第一个连接工作,但接下来的两个也返回相同的名称,即击球手的名字.
这是sql查询
select
del.over_no ,
del.delivery_no ,
batsman.sname ,
outType.name ,
outBy.sname ,
fielder.sname ,
bep.runs,
bep.deliveries,
bep.fours,
bep.sixes
from delivery del
INNER JOIN batsman_performance bep ON del.innings_id=bep.innings_id
INNER JOIN ref_player batsman ON del.batsman_id = batsman.id
INNER JOIN ref_player outBy ON del.bowler_id = outBy.id
LEFT OUTER JOIN ref_player fielder ON del.fielder_id1= fielder.id
INNER JOIN ref_out_type outType ON del.out_type_id=outType.id
and del.out_type_id IS NOT NULL
and del.innings_id=:innings_id
and bep.player_id = del.batsman_id
order by over_no, delivery_no;
Run Code Online (Sandbox Code Playgroud)
我没有为所选列使用别名,因为当我这样做时,hibernate为我使用别名的任何列引发了异常
请求处理失败; 嵌套异常是javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:"over_no"未找到柱:与根源java.sql.SQLException中无法执行查询].
此查询工作时,我在我的MySQL客户端上运行它,并返回正确的数据集,但是当我在我的代码运行它,结果莫名其妙定置覆盖随后的两个上ref_player表连接,留下我的击球手的名字在所有三列,即batsman.sname,outBy.sname和fielder.sname列中的相同名称.
最近两天我被困在这里,请帮助一下.
我想将参数设置为本机查询,
javax.persistence.EntityManager.createNativeQuery
Run Code Online (Sandbox Code Playgroud)
这样的事情
Query query = em.createNativeQuery("SELECT * FROM TABLE_A a WHERE a.name IN ?");
List<String> paramList = new ArrayList<String>();
paramList.add("firstValue");
paramList.add("secondValue");
query.setParameter(1, paramList);
Run Code Online (Sandbox Code Playgroud)
尝试此查询会导致异常:
Caused by: org.eclipse.persistence.exceptions.DatabaseException:
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near
'_binary'??\0?sr\0?java.util.ArrayListx?????a??\0?I\0?sizexp\0\0\0?w?\0\0\0t\0
f' at line 1
Error Code: 1064
Call: SELECT * FROM Client a WHERE a.name IN ?
bind => [[firstValue, secondValue]]
Query: ReadAllQuery(referenceClass=TABLE_A …Run Code Online (Sandbox Code Playgroud) 以下方法使用Java 实体管理器的createNativeQuery()方法:
public List<Dog> findDogById(String id) {
List<Dog> resultList = new ArrayList<>();
try {
resultList = persistence.entityManager().createNativeQuery(" SELECT * FROM DOG WHERE ID = '" + id+ "' ", DogEntity.class).getResultList();
} catch (Exception e) {
}
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我期望该方法返回结果时,它没有返回结果。即,当我直接运行查询时,SQL Developer我得到结果,但该方法不会返回相同的结果。
我的Syntax正确吗?我对此不确定:
" SELECT * FROM DOG WHERE ID = '" + id+ "' "
Run Code Online (Sandbox Code Playgroud)
即我需要 the'和 the吗"?
我正在尝试实现基于接口的投影,但无法使其与我的自定义类型列一起使用。
下面是我正在尝试做的示例:
存储库:
@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 中的断点处停止并在运行时手动添加我的转换器,投影将正常工作。 …
nativequery ×10
java ×6
jpa ×3
mysql ×3
hibernate ×2
arraylist ×1
converters ×1
doctrine-orm ×1
in-clause ×1
jdbc ×1
join ×1
jpa-2.1 ×1
one-to-many ×1
persistence ×1
php ×1
projection ×1
spring ×1
sql ×1