如何使用AND或OR与JPAContainer?

时间:2014-04-01 19:49:10

标签: java jpa vaadin vaadin7

我正在寻找如何使用子句AND或OR在我的应用程序中进行登录。使用SQL我使用“SELECT * FROM person WHERE email =?AND password =?”,但是使用JPAContainer我不知道该怎么做。

//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;
}

如何查看人员的电子邮件和密码并使用JPAContainer返回列表?

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您可以通过同时检查emailpassword字段来验证登录信息。我不确定为什么你需要一个JPAContainer而不是一个简单的CriteriaQuery,但这里是你的问题的答案(在我的头顶):

JPAContainer<Person> container = 
     JPAContainerFactory.<Person>makeReadOnly(Person.class, entityManager);

container.addContainerFilter(new Compare.Equal("email", emailInput));
container.addContainerFilter(new Compare.Equal("password", passwordInput));

// Query container size, eg
if(container.size()==1) { ... }

如果以这种方式添加多个容器过滤器,它们将被隐含地理解为其交集,即。 AND。

如果你想要过滤器的联合,即。或者,您必须自己构建它(如果有任何意义由您自行决定):

Filter filter = new Compare.OR(new Compare.Equal("email", emailInput), new Compare.Equal("password", passwordInput));
container.addContainerFilter(filter);

但是,我将重复使用一个简单的CriteriaQuery可能更合适


此外 - 并且不要轻视你的Person实体,我推断你在数据库中清楚地存储了密码,这是一个很大的禁忌,并且< / p>

    如果数据库遭到入侵,
  1. 会使您的用户面临风险,
  2. 如果您的代码经过审核/审核,
  3. 可能会严重打击您自己的声誉。

  4. 修改

    使用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();
    

    如果您愿意,请将cb.and(...)替换为cb.or(...)。 HTH。

答案 1 :(得分:0)

我设法做到了。

我做到了。

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();

现在有效!