【问题标题】:jpql query construction, value 1 did not match expected typejpql 查询构造,值 1 与预期类型不匹配
【发布时间】:2023-11-23 08:55:01
【问题描述】:

你好,我有两个表

1.Person table

2.Phone numer table

我正在尝试实现这样的查询

SELECT * FROM jobs.phonenumber where Person_ID='1';

但在 jpql 中。

我正在尝试制作类似的东西:

String query="SELECT p1 FROM PhoneNumber p1 WHERE p1.person=:id;

这是我的实体类的示例:

@Entity
public class PhoneNumber {
    @Id
    @GeneratedValue
    @Column(name = "phoneId")
    private long id;
    @Column(name = "phoneNumber")
    private int number;
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "Person_ID")
    private Person person;


@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "personId")
    private long id;
    @Column(name = "personName")
    private String name;
    @Column(name = "personAge")
    private int age;
    @OneToMany(mappedBy = "person")
    private List<PhoneNumber> phones;

我有一个错误:参数值1 与预期类型不匹配 [model.Person (n/a)]

这是我的方法:

@Path("{id}/phones")
@GET
@Produces(MediaType.TEXT_PLAIN)
public List<PhoneNumber> getPhoneNumbers(@PathParam(value = "id") long id) {
    List<PhoneNumber> resultList = new ArrayList<>();
    EntityManager createEntityManager = emf.createEntityManager();
    String query="select p1 from PhoneNumber p1 where p1.person=:id";
    TypedQuery<PhoneNumber> createNamedQuery = createEntityManager.createQuery(query, PhoneNumber.class);
    createNamedQuery.setParameter("id", id);
    try {
        resultList = createNamedQuery.getResultList();
    } catch (Exception e) {
        System.out.println("Could not retrive phone list");
    }
    return resultList;
}

有人可以帮我解决一下吗,我做错了什么?

【问题讨论】:

    标签: java mysql rest jpa jpql


    【解决方案1】:

    您要么需要使用person.id 来查询:

    String query="select p1 from PhoneNumber p1 where p1.person.id=:id";
    

    或先检索人,然后将其用作参数:

    Person person = createEntityManager.find(Person.class, id);
    
    String query="select p1 from PhoneNumber p1 where p1.person=:id";
    TypedQuery<PhoneNumber> createNamedQuery = createEntityManager.createQuery(query, PhoneNumber.class);
    createNamedQuery.setParameter("id", person);
    

    【讨论】:

      【解决方案2】:

      使用下面的查询:

        select p1 from PhoneNumber p1 where p1.person.id=:id
      

      【讨论】:

      • 不,不要那样做。 createQuery 需要 JPQL,并且 JPQL 中没有星号 (*)
      • PhoneNumber p1 where p1.person=:id 使用不当
      • 又是你的错,JPQL 以“SELECT {alias}”开头