语句(HqlSqlBaseWalker.java:249) 位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) 位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.docomFile(QueryTranslatorImpl.java:206) ... 10多

语句(HqlSqlBaseWalker.java:249) 位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) 位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.docomFile(QueryTranslatorImpl.java:206) ... 10多,java,hibernate,jpa,persistence,jpql,Java,Hibernate,Jpa,Persistence,Jpql,我相信好的设计会要求您为用户级表真正拥有一个单独的实体类: @Entity @Table(name = "USER_LEVEL") public class UserLevel { @OneToMany (mappedBy="userLevel") private Set<User> users; @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; p

我相信好的设计会要求您为
用户级
表真正拥有一个单独的实体类:

@Entity
@Table(name = "USER_LEVEL")
public class UserLevel {

    @OneToMany (mappedBy="userLevel")
    private Set<User> users;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String level;

    public UserLevel() {

    }

    public UserLevel(int id, String level) {
        this.id = id;
        this.level = level;
    }

    public Set<User> getUsers() {
        return users;
    }

    public int getId() {
        return id;
    } 

    public String getLevel() {
        return level;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setLevel(String level) {
        this.level = level;
    }
}
完成这些更改后,您可以轻松执行要获得结果的联接查询:

String theQuery = "SELECT u, ul FROM User u JOIN u.userLevel ul";

TypedQuery<Object[]> query = entityManager.createQuery(theQuery, Object[].class);
List<Object[]> list = query.getResultList();

for (Object[] o : list) {
    User u = o[0];
    UserLevel ul = o[1];

    System.out.println("User " + u.getUserName() + " has level " + ul.getLevel());
}
String theQuery=“从用户u选择u,ul加入u.userLevel ul”;
TypedQuery query=entityManager.createQuery(查询,对象[].class);
List=query.getResultList();
对于(对象[]o:list){
用户u=o[0];
用户级别ul=o[1];
System.out.println(“用户”+u.getUserName()+“具有级别”+ul.getLevel());
}

我相信好的设计会要求您为
用户级
表真正拥有一个单独的实体类:

@Entity
@Table(name = "USER_LEVEL")
public class UserLevel {

    @OneToMany (mappedBy="userLevel")
    private Set<User> users;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String level;

    public UserLevel() {

    }

    public UserLevel(int id, String level) {
        this.id = id;
        this.level = level;
    }

    public Set<User> getUsers() {
        return users;
    }

    public int getId() {
        return id;
    } 

    public String getLevel() {
        return level;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setLevel(String level) {
        this.level = level;
    }
}
完成这些更改后,您可以轻松执行要获得结果的联接查询:

String theQuery = "SELECT u, ul FROM User u JOIN u.userLevel ul";

TypedQuery<Object[]> query = entityManager.createQuery(theQuery, Object[].class);
List<Object[]> list = query.getResultList();

for (Object[] o : list) {
    User u = o[0];
    UserLevel ul = o[1];

    System.out.println("User " + u.getUserName() + " has level " + ul.getLevel());
}
String theQuery=“从用户u选择u,ul加入u.userLevel ul”;
TypedQuery query=entityManager.createQuery(查询,对象[].class);
List=query.getResultList();
对于(对象[]o:list){
用户u=o[0];
用户级别ul=o[1];
System.out.println(“用户”+u.getUserName()+“具有级别”+ul.getLevel());
}

您希望用户级别作为一个独立实体存在,还是希望成为
user
类中的一个字段,就像现在一样?@TimBiegeleisen我的查询有问题吗?Thanks@TimBiegeleisen不,我不需要为用户级别设置单独的实体,因为它的值是静态的。我只想得到userlevel(大写),而不是userlevel\u id。您有一个设计问题,因为从您向我们展示的内容来看,
User\u level
是一个单独的表,但您没有相应的实体类。您应该添加一个实体类,或者只是将级别字段移动到
User
表/类中。您希望用户级别作为一个单独的实体存在,还是希望成为
User
类中的一个字段,就像现在一样?@TimBiegeleisen我的查询有问题吗?Thanks@TimBiegeleisen不,我不需要为用户级别设置单独的实体,因为它的值是静态的。我只想得到userlevel(大写),而不是userlevel\u id。您有一个设计问题,因为从您向我们展示的内容来看,
User\u level
是一个单独的表,但您没有相应的实体类。您应该添加一个实体类,或者只是将级别字段移动到
User
表/类中。如果出现错误,我将与您一起解决。如果不运行代码,我无法确定我是否正确,但这是正确的想法。我在添加新用户时遇到问题。我将更新我的UserService.java。我没有在其中包含addUser方法。如果您出现错误,我将与您一起修复它们。如果不运行代码,我无法确定我是否正确,但这是正确的想法。我在添加新用户时遇到问题。我将更新我的UserService.java,因为我没有在其中包含addUser方法。
package com.taskmanagement.client;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import com.taskmanagement.entities.User;
import com.taskmanagement.service.UserService;
import java.util.List;

public class Client {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskManagement");
        EntityManager em = emf.createEntityManager();

        UserService service = new UserService(em);
        User user = new User();

        EntityTransaction transaction = em.getTransaction();

        transaction.begin();
        User userservice = service.addUser(user.getId(),"Username","Password","xxx"); 
        //System.out.println("Latest id: "+userservice.getId());
        transaction.commit();
        System.out.println(String.format("Persisted: %s\n", userservice));

        System.out.println("--- Find all Users---");
        List<User> userservices = service.findAllUser();
        for (User foundUser : userservices) {
            System.out.println(String.format("Found: %s\n", foundUser));
        }
    }
}
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: user_level of: com.taskmanagement.entities.User [SELECT u.username,u.password,ul.level FROM com.taskmanagement.entities.User u JOIN u.user_level ul]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:350)
at com.taskmanagement.service.UserService.findAllUser(UserService.java:48)
at com.taskmanagement.client.Client.main(Client.java:35)
Caused by: org.hibernate.QueryException: could not resolve property: user_level of: com.taskmanagement.entities.User [SELECT u.username,u.password,ul.level FROM com.taskmanagement.entities.User u JOIN u.user_level ul]
at org.hibernate.QueryException.generateQueryException(QueryException.java:137)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:131)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:93)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:342)
... 2 more
Caused by: org.hibernate.QueryException: could not resolve property: user_level of: com.taskmanagement.entities.User
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978)
at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:367)
at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:500)
at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:671)
at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:275)
at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:219)
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:126)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:393)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3903)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3689)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3567)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
... 10 more
@Entity
@Table(name = "USER_LEVEL")
public class UserLevel {

    @OneToMany (mappedBy="userLevel")
    private Set<User> users;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String level;

    public UserLevel() {

    }

    public UserLevel(int id, String level) {
        this.id = id;
        this.level = level;
    }

    public Set<User> getUsers() {
        return users;
    }

    public int getId() {
        return id;
    } 

    public String getLevel() {
        return level;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setLevel(String level) {
        this.level = level;
    }
}
@Entity
@Table(name = "USER")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String username;
    private String password;

    @ManyToOne
    @JoinColumn(name="id")        // 'id' is the foreign key in the UserLevel table
    private UserLevel userLevel;  // reference the entity class

    public User() {

    }

    // getters and setters omitted for brevity

    public UserLevel getUserLevel() {
        return userLevel;
    } 

    public void setUserLevel(UserLevel userLevel) {
        this.userLevel = userLevel;
    }
}
String theQuery = "SELECT u, ul FROM User u JOIN u.userLevel ul";

TypedQuery<Object[]> query = entityManager.createQuery(theQuery, Object[].class);
List<Object[]> list = query.getResultList();

for (Object[] o : list) {
    User u = o[0];
    UserLevel ul = o[1];

    System.out.println("User " + u.getUserName() + " has level " + ul.getLevel());
}