Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何查询使用EclipseLink@ReadTransformer和@WriteTransformer映射的@Entity属性的属性?_Java_Jpa_Eclipselink_Jpql - Fatal编程技术网

Java 如何查询使用EclipseLink@ReadTransformer和@WriteTransformer映射的@Entity属性的属性?

Java 如何查询使用EclipseLink@ReadTransformer和@WriteTransformer映射的@Entity属性的属性?,java,jpa,eclipselink,jpql,Java,Jpa,Eclipselink,Jpql,我正在使用EclipseLink 2.4.2 我有一个@Entity,其属性类型为Money,它是外部库中的最后一个类。货币实例是不可变的,必须作为两列持久化,一列表示金额,一列表示货币 我使用一个@ReadTransformer和两个@WriteTransformer来执行此操作: @Transformation(fetch = FetchType.EAGER, optional = false) @ReadTransformer(transformerClass = MoneyReadTra

我正在使用EclipseLink 2.4.2

我有一个@Entity,其属性类型为Money,它是外部库中的最后一个类。货币实例是不可变的,必须作为两列持久化,一列表示金额,一列表示货币

我使用一个@ReadTransformer和两个@WriteTransformer来执行此操作:

@Transformation(fetch = FetchType.EAGER, optional = false)
@ReadTransformer(transformerClass = MoneyReadTransformer.class)
@WriteTransformers({
        @WriteTransformer(
                transformerClass = MoneyCurrencyWriteTransformer.class,
                column = @Column(name = "SAVINGS_CURRENCY", nullable = false)),
        @WriteTransformer(
                transformerClass = MoneyAmountWriteTransformer.class,
                column = @Column(name = "SAVINGS_BALANCE", nullable = false))
})
private Money savings;
这很有效;我可以毫无问题地加载和保存实体

当我尝试基于嵌入式Money实例的属性对实体执行JPQL查询时,就会出现问题:

SELECT t FROM Thing t WHERE t.savings.amount > 0;
这将返回:

org.eclipse.persistence.exceptions.JPQLException: 
Exception Description: Problem compiling [SELECT t FROM Thing t WHERE t.savings.amount > 0]. 
[29, 45] The state field path 't.savings.amount' cannot be resolved to a valid type.
这种东西在Hibernate中工作得很好(使用UserTypes和@Type注释)

启动时,我还注意到以下消息:

[EL Config]: metadata: 2013-04-28 15:30:04.276--Thread(Thread[main,5,main])--The default table generator could not locate or convert a java type (null) into a database type for database field (THING.SAVINGS_CURRENCY). The generator uses java.lang.String as default java type for the field.
[EL Config]: metadata: 2013-04-28 15:30:04.276--Thread(Thread[main,5,main])--The default table generator could not locate or convert a java type (null) into a database type for database field (THING.SAVINGS_BALANCE). The generator uses java.lang.String as default java type for the field.
如果我为每个@WriteTransformer在@Column属性上定义columnDefinition,这些消息就会消失


问题可能是什么?我的怀疑是变形金刚有些不对劲,也许我没有在什么地方设置类型提示——但这并不明显,而且例子也很少。

你应该将金钱映射为一种可嵌入/嵌入的关系,而不是使用TransformationMapping。这将允许查询它,并且是标准的JPA。不确定您在使用Hibernate时谈论的是什么,TransformationMapping是特定于EclipseLink的,因此大多数情况下肯定不会使用Hibernate

要启用TransformationMappings查询,可以使用QueryKey。您需要使用描述符为列定义一个查询键,然后才能使用您为查询键指定的任何名称在JPQL中查询列。在EclipseLink中,还可以使用JPQL COLUMN()函数直接查询任何未映射的数据库列


您应该将货币映射为可嵌入/嵌入的关系,而不是使用TransformationMapping。这将允许查询它,并且是标准的JPA。不确定您在使用Hibernate时谈论的是什么,TransformationMapping是特定于EclipseLink的,因此大多数情况下肯定不会使用Hibernate

要启用TransformationMappings查询,可以使用QueryKey。您需要使用描述符为列定义一个查询键,然后才能使用您为查询键指定的任何名称在JPQL中查询列。在EclipseLink中,还可以使用JPQL COLUMN()函数直接查询任何未映射的数据库列

好吧,这确实奏效了。本质上,我必须为嵌入任何不可变值类型(如Money)的每个实体创建一个DescriptorCustomizer,然后用@Customizer注释每个这样的实体。这当然有效,但很痛苦。也许是时候重新考虑直接从外部库嵌入不可变的值类型了——或者切换回Hibernate。本质上,我必须为嵌入任何不可变值类型(如Money)的每个实体创建一个DescriptorCustomizer,然后用@Customizer注释每个这样的实体。这当然有效,但很痛苦。也许是时候重新考虑直接从外部库嵌入不可变的值类型了——或者切换回Hibernate。