在JPA查询中使用@Transient访问字段

时间:2012-10-31 09:13:21

标签: jpql

我有一个具有瞬态属性的实体:

@Entity
@Table(name = "asset")
public class Asset {
    @Transient
    private String locationIdentifier = "N/A";

    @SuppressWarnings("unused")
    @PostLoad
    private void onPostLoad() {
        if (location != null) {
            locationIdentifier = location.getIdentifier();
        }
    }

   [other stuffs]

   }

我尝试在JPA中以这种方式访问​​locationIdentifier

String sqlString = "SELECT asset FROM Asset WHERE asset.locationIdentifier = :inputstr";
Query query = entityManager.createQuery(sqlString);

但是我收到了一个错误:Cannot resolve the property locationIdentifier

我想问一下如何使用JPQL访问locationIdentifier

抱歉我的英文。提前谢谢!

4 个答案:

答案 0 :(得分:6)

JPQL查询转换为SQL查询,SQL查询操作数据库中的数据。标记属性瞬态意味着属性不会持久保存到数据库,因此无法从数据库中查询属性。

答案 1 :(得分:1)

@Transient意味着JPA完全忽略该属性。它不能在查询中引用。

只需删除@Transient即可。

此外,您需要为查询提供参数值:

String sqlString = "SELECT asset FROM Asset WHERE asset.locationIdentifier = :inputstr";
Query query = entityManager.createQuery(sqlString);
query.setParameter("inputstr", someValue);

答案 2 :(得分:0)

您可以在db表中添加列locationIdentifier并将其取消标记为Transient,或者不能在查询中使用此列。

答案 3 :(得分:0)

您不能在查询中使用临时成员。多数民众赞成没有意义! JPQL用于从数据库中获取内容,如果没有“locationIdentifier”,则无法将其添加到where子句中。如果没有这样的数据库字段,你会在SQL中期待什么?