我在我的项目中使用JPA.
我来到一个查询,我需要在五个表上进行连接操作.所以我创建了一个返回五个字段的本机查询.
现在我想将结果对象转换为包含相同五个字符串的java POJO类.
在JPA中是否有任何方法可以直接将该结果转换为POJO对象列表?
我来到以下解决方案..
@NamedNativeQueries({
@NamedNativeQuery(
name = "nativeSQL",
query = "SELECT * FROM Actors",
resultClass = db.Actor.class),
@NamedNativeQuery(
name = "nativeSQL2",
query = "SELECT COUNT(*) FROM Actors",
resultClass = XXXXX) // <--------------- problem
})
Run Code Online (Sandbox Code Playgroud)
现在在resultClass中,我们是否需要提供一个实际的JPA实体类?或者我们可以将它转换为包含相同列名的任何JAVA POJO类吗?
我想执行一个简单的本机查询,但它不起作用:
@Autowired
private EntityManager em;
Query q = em.createNativeQuery("SELECT count(*) FROM mytable where username = :username");
em.setProperty("username", "test");
(int) q.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
为什么我得到这个例外?
org.hibernate.QueryException: Not all named parameters have been set: [username]
Run Code Online (Sandbox Code Playgroud) 我想从a返回一个整数列表
javax.persistence.EntityManager.createNativeQuery 呼叫
为什么以下不正确?
entityManager.createNativeQuery("Select P.AppID From P", Integer.class);
Run Code Online (Sandbox Code Playgroud)
具体为什么我得到"......未知实体:java.lang.Integer"
我是否必须创建一个具有单个字段为Integer的实体类?
谢谢
我有一个Admin扩展的对象User.默认情况下,两个对象都在User_我的Derby数据库的表中(包含的字段Admin).通常我会选择User这样的:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root user= query.from(User.class);
Predicate predicateId = cb.equal(category.get("id"), id);
query.select(user).where(predicateId);
return em.createQuery(query).getSingleResult();
Run Code Online (Sandbox Code Playgroud)
但是由于我的查询的复杂性,我正在使用这样的本机查询:
Query query = em.createNativeQuery("SELECT USER.* FROM USER_ AS USER WHERE ID = ?");
query.setParameter(1, id);
return (User) query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
虽然这会抛出一个强制转换异常.我认为这是由于任何领域Admin.
我的问题是,如何选择User使用具有相同结果的本机查询作为第一个示例(包括与JPQL查询将返回的@LOB和@ManyToOne(等等)相同的值)?
我正在使用Spring Data JPA开展项目.我在数据库中有一个表作为my_query.
我想创建一个方法,该方法将字符串作为参数,然后在数据库中将其作为查询执行.
方法:
executeMyQuery(queryString)
Run Code Online (Sandbox Code Playgroud)
例如,当我通过
queryString= "SELECT * FROM my_query"
Run Code Online (Sandbox Code Playgroud)
那么它应该在DB级别运行该查询.
存储库类如下.
public interface MyQueryRepository extends JpaRepository<MyQuery, Long>{
public MyQuery findById(long id);
@Modifying(clearAutomatically = true)
@Transactional
@Query(value = "?1", nativeQuery = true)
public void executeMyQuery(String query);
}
Run Code Online (Sandbox Code Playgroud)
但是,它没有像我预期的那样工作.它给出以下错误.
Caused by: 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 ''select * from my_query;'' at line 1
Run Code Online (Sandbox Code Playgroud)
还有其他办法,我可以实现这个目标.提前致谢
我想使用 JPA 存储库实现执行以下查询。
询问:select sum(amount) from transactions where transaction_date_time between '2017-05-04 00:01:07' and '2017-05-04 23:03:07' and id=2;
为了找到我正在使用类似的东西:
public interface TransactionRepository extends JpaRepository<Transaction, Serializable>{
Transaction findById(Long id);
}
Run Code Online (Sandbox Code Playgroud)
所以总而言之,我需要这样的东西:
Double sumAmountByTransactionDateTimeBetweenAndMerchantId(Date from, Date to, Long merchantId);
Run Code Online (Sandbox Code Playgroud)
我不想使用@Query。我只想创建可以完成我的工作的方法名称。所以,这不是重复的。我尝试使用上面的函数名称,但它没有做我的工作。
我在jpa信息库类中有一个自定义查询:
package it.univaq.we.internshipTutor.repository;
import ...
public interface ProfessorRepository extends JpaRepository<Professor, Long> {
List<Professor> findAll();
...
@Query(value = "SELECT professor.id, professor.department_id, " +
"professor.first_name, professor.last_name, " +
"professor.email, COUNT(professor_id) as count " +
"FROM professor LEFT JOIN student_internship ON professor.id = professor_id " +
"GROUP BY professor_id ORDER BY count DESC LIMIT ?1", nativeQuery = true)
List<ProfessorInternshipCount> mostRequestedProfessors(int limit);
}
Run Code Online (Sandbox Code Playgroud)
该查询返回最需要的10位实习导师/教授;结果由教授的信息和一个整数值(计数)组成。
教授模特班:
package it.univaq.we.internshipTutor.model;
import ...
@Entity
@Table(name = "professor")
public class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", …Run Code Online (Sandbox Code Playgroud) 我使用JpaRepository并JpaSpecificationExecutor从春季的数据,我有一个问题排序的方法findAll(specification, pageable, sort)
我想通过主repo类的嵌套属性对规范的结果进行排序.这是我的情况:
主要课程
class Foo {
//other properties
@OneToMany(mappedBy="foo")
private Set<Bar> bars;
}
Run Code Online (Sandbox Code Playgroud)
订购类
class Bar {
@ManyToOne
@JoinColumn(name="fooId")
private Foo foo;
//I WANT TO SORT BY THIS FIELD
@Column
private Date date;
}
Run Code Online (Sandbox Code Playgroud)
这是我的回购
interface FooRepo extends JpaRepository<Foo , Long>,
JpaSpecificationExecutor<Foo>{
//just jparepo methods
}
Run Code Online (Sandbox Code Playgroud)
这就是我正在尝试订购这个结果
void anymethod(){
Sort sort = new Sort(Bar_.date.getName());
PageRequest pr = new PageRequest(anyPage, anyMaxResultsNum, sort);
repository.findAll(anySpecification, pr);
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个我得到"PropertyReferenceException:找不到类型Foo的属性日期!"
我怎样才能做到这一点?
我有以下包含NativeQuery的地方,我需要在其中设置参数,但由于未设置参数而使错误,因此查询为
SELECT movieId, title, genres FROM movies where title like '%%'"
Run Code Online (Sandbox Code Playgroud)
因此返回所有行。怎么了
public List<T> findMovie(String keyword) {
Query q = getEntityManager().createNativeQuery("SELECT movieId, title, genres FROM movies where title like '%?%'", entityClass);
q.setParameter(1, keyword); //etc
return q.getResultList();
}
Run Code Online (Sandbox Code Playgroud) java ×7
jpa ×6
spring ×3
spring-data ×3
hibernate ×2
mysql ×2
spring-boot ×2
sql ×2
ejb-3.0 ×1
jpql ×1
nativequery ×1