JPA NamedQuery获取不同列

JPA NamedQuery获取不同列,jpa,distinct,Jpa,Distinct,我想从我的用户表中获取不同城市的列表。我认为下面的代码可以工作,但给出了一个错误: User.java @Entity @Table(name="user_info") ... @NamedQuery(name = "User.all.cities", query = "SELECT distinct u.city FROM User u"), ... @embedded private City city; UserBusinessLogic.java: ... TypedQuery<

我想从我的用户表中获取不同城市的列表。我认为下面的代码可以工作,但给出了一个错误:

User.java
@Entity
@Table(name="user_info")
...
@NamedQuery(name = "User.all.cities", query = "SELECT distinct u.city FROM User u"),
...
@embedded
private City city;

UserBusinessLogic.java:
...
TypedQuery<City> typedQuery = entityManager.createNamedQuery("User.all.cities",User.class);
List<City> names = typedQuery.getResultList();
...
User.java
@实体
@表(name=“user\u info”)
...
@NamedQuery(name=“User.all.cities”,query=“从用户u中选择不同的u.city”),
...
@嵌入
私人城市;
UserBusinessLogic.java:
...
TypedQuery TypedQuery=entityManager.createNamedQuery(“User.all.cities”,User.class);
列表名称=typedQuery.getResultList();
...
它给出:类型不匹配不能将列表转换为列表。我在getResult a City上尝试了两个get first用户,但在下面一行出现了相同的错误

我看到了一些示例,但并没有真正说明如何使用正确的代码,只是使用SQL语法

谢谢你的帮助


Jess

第一件看起来不太好的事情是,您请求城市对象,但声明要获取用户的

你有:

@NamedQuery(name = "User.all.cities", 
            query = "SELECT distinct u.city FROM User u"),

TypedQuery<City> typedQuery = 
                  entityManager.createNamedQuery("User.all.cities", User.class);
@NamedQuery(name=“User.all.cities”,
query=“从用户u中选择不同的u.city”),
类型查询类型查询=
entityManager.createNamedQuery(“User.all.cities”,User.class);
应:

TypedQuery TypedQuery=
entityManager.createNamedQuery(“User.all.cities”,City.class);

第一件看起来不太好的事情是,您请求城市对象,但声明获取用户的

你有:

@NamedQuery(name = "User.all.cities", 
            query = "SELECT distinct u.city FROM User u"),

TypedQuery<City> typedQuery = 
                  entityManager.createNamedQuery("User.all.cities", User.class);
@NamedQuery(name=“User.all.cities”,
query=“从用户u中选择不同的u.city”),
类型查询类型查询=
entityManager.createNamedQuery(“User.all.cities”,User.class);
应:

TypedQuery TypedQuery=
entityManager.createNamedQuery(“User.all.cities”,City.class);

有效的代码是:

results = getJpaTemplate().execute(new JpaCallback<List<City>>() {
  @Override
  public List<City> doInJpa(EntityManager em) throws PersistenceException {
    TypedQuery<City> query = em.createNamedQuery("User.all.cities", City.class);
    return query.getResultList() ;
   }
}) ;
results=getJpaTemplate().execute(新的JpaCallback()){
@凌驾
公共列表doInJpa(EntityManager em)引发PersistenceException{
TypedQuery query=em.createNamedQuery(“User.all.cities”,City.class);
返回query.getResultList();
}
}) ;

有效的代码是:

results = getJpaTemplate().execute(new JpaCallback<List<City>>() {
  @Override
  public List<City> doInJpa(EntityManager em) throws PersistenceException {
    TypedQuery<City> query = em.createNamedQuery("User.all.cities", City.class);
    return query.getResultList() ;
   }
}) ;
results=getJpaTemplate().execute(新的JpaCallback()){
@凌驾
公共列表doInJpa(EntityManager em)引发PersistenceException{
TypedQuery query=em.createNamedQuery(“User.all.cities”,City.class);
返回query.getResultList();
}
}) ;

能否粘贴堆栈跟踪?能否粘贴堆栈跟踪?谢谢,这就是问题所在。我的印象是,我需要在定义查询的地方使用类名,但事实并非如此,因为JPA中的查询名称应该是唯一的。@jessarah-如果您有一个有效的解决方案,请将一些答案标记为正确答案,以向其他人表明您的问题已得到回答。谢谢,这就是问题所在。我的印象是,我需要在定义查询的地方使用类名,但事实并非如此,因为JPA中的查询名称应该是唯一的。@jessarah-如果您有一个有效的解决方案,请将一些答案标记为正确答案,给别人一个你的问题得到回答的信号。你应该投票给皮奥特的帖子,而不是为他的答案给自己打分。你应该投票给皮奥特的帖子,而不是为他的答案给自己打分。