我试图通过JPQL查询声明中的字段进行排序,看起来它应该非常简单,但我不断收到编译器错误.
我正在尝试通过UserClockDate列进行排序,该列是UserTime行的一部分.但每次我尝试编译时都会收到错误:
严重:命名查询出错:fetchIfUserIsClockedInWithUser org.hibernate.QueryException:无法解析属性:UserClockDate of:models.UserTime [SELECT ut FROM models.UserTime ut WHERE USER_ID =:user ORDER BY ut.UserClockDate DESC]
如果我只是取出ORDER BY它编译好了.
这是班级本身的相关部分:
@NamedQueries({
@NamedQuery(name = "fetchAllUserTimes", query = "SELECT ut FROM UserTime ut"),
@NamedQuery(name = "fetchIfUserIsClockedInWithUser", query = "SELECT ut FROM UserTime ut WHERE USER_ID = :user ORDER BY ut.UserClockDate DESC")
})
@Entity
@Table(name = "userTime")
@Component
public class UserTime implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "UserTimeId")
private int userTimeId;
@ManyToOne
@JoinColumn(name = "USER_ID") …Run Code Online (Sandbox Code Playgroud) 嗨,我是hibernate的新手.我阅读了很多关于哪本书以及要阅读的规范的线程和讨论.但问题是有些线程太老了,我不明白从哪里开始.我从开发人员指南中的Hibernate规范开始,我认为这太复杂了.所以我读了一些小教程.实际上我被分配到一些项目,我被告知使用了Hibernate.但由于对Hibernate知之甚少,我完全迷失了.在代码中我可以看到在Maven pom中使用了Hibernate.我发现META-INF/Persistence.xml包含:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="EmployeeDatabase" transaction-type="JTA">
<jta-data-source>java:EmpDS</jta-data-source>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>entity.Employee</class>
<properties>
<property name="hibernate.connection.password" value="Usha" />
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/Employee" />
<property name="hibernate.connection.username" value="Usha" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
我认为hibernate配置必须通过hibernate.cfg.xml来完成.但我可以在任何地方找到它.在执行查询时代码中没有对hibernate的引用.所有查询都是使用import javax.persistence.Query完成的.所以我猜JPQL用于执行查询.
所以我的问题是:这真的是Hibernate或JPA还是什么?
我什么时候可以说这是使用Hibernate进行持久化.
何时使用JPQL以及何时使用HQL?
请有人可以指导我完成这件事.要清楚我想首先学习Hibernate,然后深入挖掘我的作业.但我不知道从哪里开始.哪本书或教程最好.
最诚挚的问候,Jeena
我有两个相关的实体,用户和消息.消息有两个字段,包含用户实体,收件人和发件人.
我可以执行两个联接的联合,我将用户从Message的两个字段中获取到一个结果列表吗?
例如:
(select u from Message m join m.recipient) union (select u from Message m join m.sender)
Run Code Online (Sandbox Code Playgroud)
谢谢你的回答.
问候
Piotr Kozlowski
我有以下查询
@Query("Select cp from ChannelProgramme cp"
+ " where cp.programme.programmeId in (select programmeId from Programme programme"
+ " inner join programme.performers performer"
+ " where performer.performerId in :performerID)"
+ " AND (cp.progDate BETWEEN :fromDate AND :toDate)"
+ " ORDER BY cp.progDate, cp.startTime")
List<ChannelProgramme> findScheduledPerformerProgrammes(@Param("performerID") Long performerId, @Param("fromDate") Date fromDate, @Param("toDate") Date toDate);
Run Code Online (Sandbox Code Playgroud)
这引发了以下异常
Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode
\-[IDENT] IdentNode: 'programmeId' {originalText=programmeId}
at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:174)
at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:924)
at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:692)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:665)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.collectionFunctionOrSubselect(HqlSqlBaseWalker.java:4905)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.inRhs(HqlSqlBaseWalker.java:4806)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4473) …Run Code Online (Sandbox Code Playgroud) 我有一个Query-annotated Spring JPA repo,它看起来像这样:
@Repository
public interface MainRepository
extends
JpaRepository<MainEntity, MainEntity.ID>,
JpaSpecificationExecutor<MainEntity> {
@Query("select e.start, e.finish,e.forename,e.surname from MainEntity e where e.volunteerId= :id "
+ "and e.areaId>0 and e.isAssignment=true order by e.start")
List<MainEntity> findAssignments(@Param("id") int volunteerId);
}
Run Code Online (Sandbox Code Playgroud)
但是,尽管返回类型,但不会返回MainEntity对象列表.它返回与所请求的字段类型对应的List of Object [].
这是怎么回事???
我有这样的对象:
@Entity
public class DocumentationRecord {
@Id
@GeneratedValue
private long id;
private String topic;
private boolean isParent;
@OneToMany
private List<DocumentationRecord> children;
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想只获得主题和ID.有没有办法得到这样的格式:
[
{
id: 4234234,
topic: "fsdfsdf"
},...
]
Run Code Online (Sandbox Code Playgroud)
因为即使只使用此查询
public interface DocumentationRecordRepository extends CrudRepository<DocumentationRecord, Long> {
@Query("SELECT d.topic as topic, d.id as id FROM DocumentationRecord d")
List<DocumentationRecord> getAllTopics();
}
Run Code Online (Sandbox Code Playgroud)
我只能得到这样的记录:
[
[
"youngChild topic",
317
],
[
"oldChild topic",
318
],
[
"child topic",
319
],
]
Run Code Online (Sandbox Code Playgroud)
我不喜欢数组数组我想获得具有属性id和主题的对象数组.实现这一目标最好的方法是什么?
@Entity
@Table(name="tblUser")
public class User {
@Id
@GeneratedValue
@Column(name="id")
private Long id;
@Column(name="email",nullable=false)
private String email;
@Column(name="password",nullable=false)
private String password;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@OneToMany(mappedBy="user")
private List<Address> addresses = new ArrayList<>();
}
@Entity
@Table(name="tblAddress")
public class Address {
@Id
@GeneratedValue
@Column
private Long id;
@Column
private String streat;
@Column
private String number;
@ManyToOne(fetch=FetchType.EAGER)
private User user;
}
public interface UserService {
List<User> findAll();
}
@Service
public class JpaUserService implements UserService {
@Autowired
private UserRepository userRepository;
@Override …Run Code Online (Sandbox Code Playgroud) 我已经为Amazon Aurora数据库编写了一个查询,以在我的接口CrudRepositoryExtended中删除一些对象,但是当我执行该查询时,它将引发异常!
@Transactional
@Query("delete from HotelPrice hp where hp.updateDate < ?1 ")
void deletePriceOlderThan (Date date);
Run Code Online (Sandbox Code Playgroud)
异常跟踪跟踪:
Caused by: java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.gamesa.backend.persistence.domain.backend.HotelPrice hp where hp.updateDate < ?1 ]
at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:554)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:208)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:87)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:499)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:477)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 35 common frames omitted
Run Code Online (Sandbox Code Playgroud) 我有一个简单的JOIN查询,我需要在Table_A和Order之间运行,但因为Order是保留的关键字,我收到以下错误:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: Order near line 1
Run Code Online (Sandbox Code Playgroud)
这是查询:
List<Tuple> list = entityManager.createQuery(
"select a " +
"from Table_A a " +
"join Order o on a.orderID = o.orderID " +
"where o.status = :status ", Tuple.class)
.setParameter("status", "Completed")
.getResultList();
Run Code Online (Sandbox Code Playgroud)
我已经解决了人们有类似困难的问题,但问题是列名称的问题,幸运的是有一个解决方法,但当关键字是实体名称时,我找不到解决方案.我不想因为这个障碍而改变班级名称,我想知道是否有人遇到过类似的问题,可以帮助我解决问题.
张贴类似问题的人还没有得到回答,请看这个链接: Similar Question
列名称出现问题的人通过执行以下操作解决了这个问题:
在我的Spring boot项目,我需要查询的表entity名为XrayVulnerabilityEntity具有的能力paging,sorting和specification。
Paging和sorting实施似乎没问题。但是当我添加时Specification,它throws an error是这样的:
引起:org.springframework.beans.factory.BeanCreationException:创建名为“xrayVulnerabilityRepository”的bean时出错:调用init方法失败;嵌套异常是 java.lang.IllegalArgumentException:要么在除 Pageable 和 Sort 类型之外的所有参数上使用 @Param,要么根本不使用!
我使用的存储库:
@Repository
public interface XrayVulnerabilityRepository extends PagingAndSortingRepository<XrayVulnerabilityEntity,XrayVulnerabilityPK> , JpaSpecificationExecutor<XrayVulnerabilityEntity>{
@Query("SELECT x FROM XrayVulnerabilityEntity x,DomainArtifactEntity d WHERE d.domainOrgName=:domainOrgNameParam AND x.domainArtifactId=d")
public Page<XrayVulnerabilityEntity> findAll(@Param(value = "domainOrgNameParam") String domainOrgName,Specification<XrayVulnerabilityEntity> spec, Pageable pageable);
@Query("SELECT COUNT(x) FROM XrayVulnerabilityEntity x,DomainArtifactEntity d WHERE d.domainOrgName=:domainOrgNameParam AND x.domainArtifactId=d")
public Long getCount(@Param(value = "domainOrgNameParam") String domainOrgName,Specification<XrayVulnerabilityEntity> spec);
}
Run Code Online (Sandbox Code Playgroud)
我在实施时做错了 …
在我的软件中,我有一个实体(我们称之为Member)和另一个实体(我们称之为State)的集合。我需要编写的查询应返回所有没有State特定属性值(例如5)的成员。
以下是实体的相关部分:
public class Member {
@JoinColumn(name = "MEMBER_ID")
@OneToMany
private List<State> states;
@Column
private String name;
}
public class State {
@Column
private int property;
}
Run Code Online (Sandbox Code Playgroud)
Member请注意,和之间没有双向映射State,该映射是在关系 ( ) 的非拥有方声明的Member。在 SQL 中我会创建一个像这样的查询:
public class Member {
@JoinColumn(name = "MEMBER_ID")
@OneToMany
private List<State> states;
@Column
private String name;
}
public class State {
@Column
private int property;
}
Run Code Online (Sandbox Code Playgroud)
但我不知道有什么方法可以在 JPQL 中实现相同的功能,而无需在关系的拥有方进行映射。有没有什么方法可以实现这一点而不必费心双向映射?
jpql ×11
java ×8
hibernate ×7
jpa ×6
spring ×4
hql ×1
postgresql ×1
spring-boot ×1
spring-data ×1
sql ×1