Java 如何与JPA容器一起使用AND或or?

Java 如何与JPA容器一起使用AND或or?,java,jpa,vaadin,vaadin7,Java,Jpa,Vaadin,Vaadin7,我正在寻找如何使用子句和或在我的应用程序中进行登录。对于SQL,我使用“SELECT*FROM person WHERE email=?和password=?”,但是对于JPA容器,我不知道如何做到这一点 //Beans @Entity public class Person { @Id @GeneratedValue private Integer id; @NotNull @Size(min=5, max=50) privat

我正在寻找如何使用子句和或在我的应用程序中进行登录。对于SQL,我使用“SELECT*FROM person WHERE email=?和password=?”,但是对于JPA容器,我不知道如何做到这一点

//Beans
@Entity
public class Person {
    @Id
    @GeneratedValue
    private Integer id;

    @NotNull        
    @Size(min=5, max=50)
    private String name;

    @Email
    private Email email;

    @Size(min=8,max=8)
    private String password;

    @ManyToOne
    private PersonType personType;
}

@Entity
public class PersonType {
    @Id
    @GeneratedValue
    private Integer id;

    @NotNull        
    @Size(min=5, max=50)
    private String personType;
}

如何使用JPA容器检查人员的电子邮件和密码并返回列表?

如果我理解正确,您希望通过检查
电子邮件和
密码字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):

不过,我要重复一次,使用普通的CriteriaQuery可能更合适


此外,请不要掉以轻心,从您的
个人
实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且

  • 如果数据库受损,可能会使您的用户面临风险,并且
  • 如果您的代码经过审核/审查,可能会严重打击您自己的声誉

  • 编辑

    使用CriteriaQuery,您可以执行以下操作:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Long> q = qb.createQuery(Long.class);
    Root<Person> root = q.from(Person.class);
    Path<String> email = root.get("email");
    Path<String> password = root.get("password");
    
    cq.select(cb.count(root)).where(
        cb.and(
            cb.equal(email, emailInput),
            cb.equal(password, passwordInput)
        )
    );
    
    return entityManager.createQuery(cq).getSingleResult();
    
    CriteriaBuilder cb=entityManager.getCriteriaBuilder();
    CriteriaQuery q=qb.createQuery(Long.class);
    Root=q.from(Person.class);
    路径email=root.get(“email”);
    路径密码=root.get(“密码”);
    cq.选择(cb.计数(根))。其中(
    cb.和(
    cb.equal(电子邮件、电子邮件输入),
    cb.equal(密码、密码输入)
    )
    );
    返回entityManager.createQuery(cq.getSingleResult();
    

    如果您愿意,将
    cb.和(…)
    替换为
    cb.或(…)
    。HTH.

    如果我理解正确,您希望通过检查
    电子邮件
    密码
    字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):

    不过,我要重复一次,使用普通的CriteriaQuery可能更合适


    此外,请不要掉以轻心,从您的
    个人
    实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且

  • 如果数据库受损,可能会使您的用户面临风险,并且
  • 如果您的代码经过审核/审查,可能会严重打击您自己的声誉

  • 编辑

    使用CriteriaQuery,您可以执行以下操作:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Long> q = qb.createQuery(Long.class);
    Root<Person> root = q.from(Person.class);
    Path<String> email = root.get("email");
    Path<String> password = root.get("password");
    
    cq.select(cb.count(root)).where(
        cb.and(
            cb.equal(email, emailInput),
            cb.equal(password, passwordInput)
        )
    );
    
    return entityManager.createQuery(cq).getSingleResult();
    
    CriteriaBuilder cb=entityManager.getCriteriaBuilder();
    CriteriaQuery q=qb.createQuery(Long.class);
    Root=q.from(Person.class);
    路径email=root.get(“email”);
    路径密码=root.get(“密码”);
    cq.选择(cb.计数(根))。其中(
    cb.和(
    cb.equal(电子邮件、电子邮件输入),
    cb.equal(密码、密码输入)
    )
    );
    返回entityManager.createQuery(cq.getSingleResult();
    

    如果您愿意,将
    cb.和(…)
    替换为
    cb.或(…)
    。HTH.

    如果我理解正确,您希望通过检查
    电子邮件
    密码
    字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):

    不过,我要重复一次,使用普通的CriteriaQuery可能更合适


    此外,请不要掉以轻心,从您的
    个人
    实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且

  • 如果数据库受损,可能会使您的用户面临风险,并且
  • 如果您的代码经过审核/审查,可能会严重打击您自己的声誉

  • 编辑

    使用CriteriaQuery,您可以执行以下操作:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Long> q = qb.createQuery(Long.class);
    Root<Person> root = q.from(Person.class);
    Path<String> email = root.get("email");
    Path<String> password = root.get("password");
    
    cq.select(cb.count(root)).where(
        cb.and(
            cb.equal(email, emailInput),
            cb.equal(password, passwordInput)
        )
    );
    
    return entityManager.createQuery(cq).getSingleResult();
    
    CriteriaBuilder cb=entityManager.getCriteriaBuilder();
    CriteriaQuery q=qb.createQuery(Long.class);
    Root=q.from(Person.class);
    路径email=root.get(“email”);
    路径密码=root.get(“密码”);
    cq.选择(cb.计数(根))。其中(
    cb.和(
    cb.equal(电子邮件、电子邮件输入),
    cb.equal(密码、密码输入)
    )
    );
    返回entityManager.createQuery(cq.getSingleResult();
    

    如果您愿意,将
    cb.和(…)
    替换为
    cb.或(…)
    。HTH.

    如果我理解正确,您希望通过检查
    电子邮件
    密码
    字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):

    不过,我要重复一次,使用普通的CriteriaQuery可能更合适


    此外,请不要掉以轻心,从您的
    个人
    实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且

  • 如果数据库受损,可能会使您的用户面临风险,并且
  • 如果您的代码经过审核/审查,可能会严重打击您自己的声誉

  • 编辑

    使用CriteriaQuery,您可以执行以下操作:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Long> q = qb.createQuery(Long.class);
    Root<Person> root = q.from(Person.class);
    Path<String> email = root.get("email");
    Path<String> password = root.get("password");
    
    cq.select(cb.count(root)).where(
        cb.and(
            cb.equal(email, emailInput),
            cb.equal(password, passwordInput)
        )
    );
    
    return entityManager.createQuery(cq).getSingleResult();
    
    CriteriaBuilder cb=entityManager.getCriteriaBuilder();
    CriteriaQuery q=qb.createQuery(Long.class);
    Root=q.from(Person.class);
    路径email=root.get(“email”);
    路径密码=root.get(“密码”);
    cq.选择(cb.计数(根))。其中(
    cb.和(
    cb.equal(电子邮件、电子邮件输入),
    cb.equal(密码、密码输入)
    )
    );
    返回entityManager.createQuery(cq.getSingleResult();
    
    如果您愿意,将
    cb.和(…)
    替换为
    cb.或(…)
    。嗯。

    我设法做到了

    是我干的

    EntityManager em = datasource.getEntityProvider().getEntityManager();       
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Person> c = cb.createQuery(Person.class);
    Root<Person> person = c.from(Person.class);
    c.where(
        cb.and(
    cb.equal(person.get("email"), email.getValue()),
    cb.equal(person.get("password"), password.getValue()))
    );
    TypedQuery tq = em.createQuery(c);
    List<Person> lista = tq.getResultList();
    
    EntityManager em=datasource.getEntityProvider().getEntityManager();
    CriteriaBuilder cb=em.getCriteriaBuilder();
    CriteriaQuery c=cb.createQuery(Person.class);
    根person=c.from(person.class);
    c、 在哪里(
    cb.和(
    cb.equal(person.get(“email”)、email.getValue(),
    cb.equal(person.get(“密码”)、password.getValue())
    );
    TypedQuery tq=em.createQuery(c);