我是Spring JPA的新手.我有一个名为Product的模型.我正在尝试编写一个api终点来获取products表的最近记录.
public static interface Repository extends PagingAndSortingRepository<Product, Long>
{
List findTop2ByOrderByIdDesc();
}
Run Code Online (Sandbox Code Playgroud)
当我运行我的应用程序HAL浏览器 http:// localhost:8080/api/v1/products/search/findTop2ByOrderByIdDesc
我收到的错误是
{
"timestamp": 1440573947629,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.IncorrectResultSizeDataAccessException",
"message": "result returns more than one elements; nested exception is javax.persistence.NonUniqueResultException: result returns more than one elements",
"path": "/api/v1/products/search/findTop2ByOrderByIdDesc"
}
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题.好心提醒
这是我的存储库配置:
@Configuration
public class RepositoryConfing {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
entityManagerFactoryBean.setPackagesToScan("com.imdb.model");
return entityManagerFactoryBean;
}
@Bean
public BasicDataSource dataSource(){
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl("jdbc:postgresql://localhost:5432/imdb");
ds.setUsername("***");
ds.setPassword("***");
ds.setInitialSize(5);
return ds;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter(){
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.POSTGRESQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
return adapter;
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用merge方法时,我得到一个例外:javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
可能是我RepositoryConfig缺少一些额外的配置? …
在我的实体模型中,我有一个 ManyToMany RelationUser和UserGroup
User 是一个公共@Entity类,而是UserGroup一个 Java enum。
映射看起来像这样:
@ElementCollection(targetClass = my.package.UserRight.class, fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "MD_USER_RIGHTS", joinColumns = @JoinColumn(name = "REF_USER_ID"))
@Column(name = "USER_GROUP")
@Getter @Setter private Set<UserRight> userGroups;
Run Code Online (Sandbox Code Playgroud)
除非我尝试访问通过 JPQL 设置的用户组,否则一切正常。我不想将来自用户实体的所有信息暴露给下一层,所以我编写了一个简单的 JPQL 查询来从我的用户实体创建一些 DTO:
简化:
public List<UserDTO> findAllActive() {
Query q = em.createQuery("SELECT NEW my.package.UserDTO(m.name, m.id, m.userGroups)
FROM User m ");
return q.getResultList();
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [SELECT NEW …Run Code Online (Sandbox Code Playgroud) 我正在OneToOne研究Hibernate的映射示例并面临以下错误:我不确定这里出了什么问题.请指导.
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.Util.getInstance(Util.java:382)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2281)
at org.hibernate.id.enhanced.TableStructure.executeQuery(TableStructure.java:224)
at org.hibernate.id.enhanced.TableStructure.access$300(TableStructure.java:46)
at org.hibernate.id.enhanced.TableStructure$1$1.execute(TableStructure.java:139)
at org.hibernate.id.enhanced.TableStructure$1$1.execute(TableStructure.java:126)
at org.hibernate.jdbc.WorkExecutor.executeReturningWork(WorkExecutor.java:55)
at org.hibernate.jdbc.AbstractReturningWork.accept(AbstractReturningWork.java:34)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:56)
... 13 more
Run Code Online (Sandbox Code Playgroud)
Vehicle.java
@Entity
@Table(name="VEHICLE")
public class Vehicle {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="VEHICLE_ID")
private Integer vehicleId;
@Column(name="VEHICLE_NAME")
private String vehicleName;
// setter and getters
} …Run Code Online (Sandbox Code Playgroud) 我有一个带有字段 id 、 name 、 price 等的类产品,...
我只想从表中获取名称..
我目前正在使用此查询
String sql = "select name from product where price = 100";
SqlQuery sqlQuery = Ebean.createSqlQuery(sql);
List<SqlRow> list = sqlQuery.findList();
Run Code Online (Sandbox Code Playgroud)
使用 List 查找但仅获取名称的警报方式是什么
List<product> list = product.find.where("price = 100").select("name").findList();
Run Code Online (Sandbox Code Playgroud)
我认为以下查询效率不高,因为它获取所有数据并返回我们对其进行过滤的情况
List<String> list = new ArrayList<String>();
for(product p: product.find.select("name").findList())
{
list.add(p.name);
}
return list;
Run Code Online (Sandbox Code Playgroud) 我正在尝试在扩展CrudRepository接口的接口中创建自定义查询.不幸的是,每次我收到java.lang.AbstractMethodError时出于某种原因.请参阅下面的完整堆栈跟踪.
据我所知,问题是Spring框架应该"神奇地"为我的方法声明创建一个实现,但由于某种原因它没有成功.
存储库界面:
public interface PresentationRepository extends CrudRepository<Presentation, Integer> {
Iterable<Presentation> findAll(Sort sort);
Page<Presentation> findAll(Pageable pageable);
List<Presentation> findByTitle(String title); // the problematic line
}
Run Code Online (Sandbox Code Playgroud)
演示实体课程:
@Entity
@Table(name = "presentation")
public class Presentation {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "presentation_id")
Integer id;
String title;
String logo;
@Column(name = "length")
Integer interval;
@Column(name = "pages")
Integer pageCount;
Date created;
Date modified;
Date approved;
Date published;
Date deleted;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "presentation_filters",
joinColumns = @JoinColumn(name = "presentation_id"),
inverseJoinColumns = …Run Code Online (Sandbox Code Playgroud) @Query("select c from :entity c )
BaseEntity findOne( @Param("value") String entity );
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误说:
由以下原因引起:org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌::靠近第1行,第15列[从:entity c中选择c],位于org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException。 java:91)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
我有一个Spring引导应用程序,运行jpa数据和hsqldb 2.3.3(在Centos 7中),应用程序运行正常,但我想使用HSQLDB数据库管理器来检查数据状态,但它失败了:
application.properties:
spring.datasource.url=jdbc:hsqldb:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create
Run Code Online (Sandbox Code Playgroud)
启动HSQLDB的命令:
java -cp /home/mycentos/.m2/repository/org/hsqldb/hsqldb/2.3.3/hsqldb-2.3.3.jar org.hsqldb.util.DatabaseManagerSwing
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用HSQLDB服务器模式登录,则会弹出Connection refused错误
jdbc:hsqldb:hsql://localhost/testdb
Run Code Online (Sandbox Code Playgroud)
如果我尝试登录内存中的数据库,我可以登录但不会显示表和数据
jdbc:hsqldb:hsql:testdb
Run Code Online (Sandbox Code Playgroud)
题:
我已经解决了这里发布的大多数类似问题,发现那里的解决方案是使用 javax.persistence.Entity 导入而不是 org.hibernate.annotations.Entity。
我使用了正确的导入,但仍然得到 org.hibernate.MappingException
我正在使用 mysql-connector-java 版本 6.0.5 和 hibernate-core 版本 5.2.6.Final 和 hibernate-annotations 版本 3.5.6-Final
Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.myApp.data.entities.User
at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1627)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669)
at com.myApp.data.Application.main(Application.java:26)
Run Code Online (Sandbox Code Playgroud)
pom.xml 如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myApp</groupId>
<artifactId>hibernate-course</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hibernate-course</name>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.6.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>mysql</groupId> …Run Code Online (Sandbox Code Playgroud) 我需要通过 SQL 查询数据库的函数,就像这样简单
@Query("SELECT random()")
如何实现域/存储库或服务方法来执行此操作?
java ×5
spring ×5
hibernate ×3
spring-data ×3
spring-boot ×2
ebean ×1
eclipselink ×1
exception ×1
hal ×1
hsqldb ×1
jdbc ×1
jpa ×1
jpql ×1
mysql ×1
spring-mvc ×1
transactions ×1